正規表現の概要#

Xarpiteでは、文字列と正規表現オブジェクトを組み合わせた検索や抽出ができます。

正規表現オブジェクトは一般的なオブジェクトの一形態ではなく、数値や文字列などと並ぶ、プリミティブな値です。

正規表現オブジェクトの生成#

正規表現オブジェクトは正規表現リテラル /pattern/flags によって生成します。

また、関数版の REGEX.new もあります。

正規表現リテラル#

正規表現リテラルは正規表現オブジェクトを生成する最も一般的な方法です。

flags 節は省略可能であり、以下の形式を持ちます。

  • /pattern/flags
  • /pattern/
$ xa ' /apple/ '
# /apple/

$ xa ' /apple/i '
# /apple/i

パターン#

pattern には正規表現のパターンを記述します。

文字列 意味
\\/ /
CRLF LF
CR LF
LF LF
\\ (/ 以外の1文字) \\ 後続するその1文字
それ以外の文字 その文字自身

おおよそそのままの形で正規表現を記述することができます。

空パターンの禁止#

pattern を空にすることはできず、 // は行コメントとして扱われます。

代わりに、 /(?:)/ のような等価な働きをする別の正規表現を記述してください。

フラグ#

flags には以下の文字で構成される imig のような文字列を記述します。

  • m 複数行モード( ^$ が行頭や行末にマッチ)
  • i 大文字小文字を無視
  • g 全件検索(グローバルマッチ)

正規表現エンジン#

pattern は、実際にはKotlinの String.toRegex に渡され、プラットフォームごとに異なる正規表現エンジンで解釈されます。

REGEX.new 正規表現オブジェクトのファクトリ関数#

REGEX.new(pattern: STRING[; flags: STRING]): REGEX

正規表現オブジェクトを生成します。

この関数は、正規表現リテラル /pattern/flags と丁度同じように動作します。

$ xa 'REGEX.new("apple")'
# /apple/

$ xa 'REGEX.new("apple"; "i")'
# /apple/i

正規表現オブジェクトのプロパティアクセス#

正規表現オブジェクトでは、以下のプロパティが利用できます

  • pattern
  • flags
$ xa '/apple/i.pattern'
# apple

$ xa '/apple/i.flags'
# i

$ xa '/apple/.flags'
# NULL

部分一致判定#

regex @ string 演算子で、文字列に正規表現が部分一致するか否かを判定できます。

$ xa ' /pp/ @ "apple" '
# TRUE

$ xa ' /xy/ @ "apple" '
# FALSE

マッチ演算子#

string =~ regex 演算子で、文字列に対して正規表現マッチを行うことができます。

マッチした場合は非 NULL のマッチリザルトが、マッチしなかった場合は NULL が返されます。

マッチリザルトは、 result.0 でマッチ全体、 result.1 以降でマッチした各グループの文字列にアクセスできます。

result[] は、マッチ全体と各グループを含む配列に変換します。

$ xa -q '
  result := "apple" =~ /pp(.)/

  OUT << result.0
  OUT << result.1
  OUT << result[]
'
# ppl
# l
# [ppl;l]
$ xa -q '
  result := "apple" =~ /xy(.)/

  OUT << result
'
# NULL

ストリームに対するマッチ#

string がストリームの場合、各要素に対して item =~ regex を適用し、その結果をストリームとして返します。

$ xa ' ("Red apple pie", "Yellow banana cake", "Pink cherry tart") =~ / ([a-z]+) / | _.1 '
# apple
# banana
# cherry

$ xa ' ("Red apple pie", "Yellow banana cake", "Pink cherry tart") =~ /([A-Za-z]+)/g | _.1 '
# Red
# apple
# pie
# Yellow
# banana
# cake
# Pink
# cherry
# tart

グローバルマッチ#

g フラグを付与した正規表現によるマッチでは、すべてのマッチ結果からなるストリームが返されます。

$ xa ' "apple pebble people" =~ /(\w*pl\w*)/g | _.1 '
# apple
# people

正規表現オブジェクトの関数呼び出し#

正規表現オブジェクトを関数として呼び出した場合、マッチ演算子と同じ動作をします。

$ xa ' /pp(.)/("apple").1 '
# l