正規表現の概要#
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には以下の文字で構成されるiやmigのような文字列を記述します。
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
正規表現オブジェクトのプロパティアクセス#
正規表現オブジェクトでは、以下のプロパティが利用できます
patternflags
$ 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
否定マッチ#
string !~ regex演算子で、文字列が正規表現にマッチしないかどうかを判定できます。
この演算子は、マッチ結果を論理値化して否定した値を返します。
stringがストリームの場合は、各要素についてこれを行ったストリームを返します。
$ xa ' "apple" !~ /pp/ '
# FALSE
$ xa ' "apple" !~ /xy/ '
# TRUE
グローバルマッチのフラグは、実質的に無意味です。
プロパティアクセスによるマッチ#
文字列のプロパティアクセスは、キーが正規表現である場合、string =~ regexと同じマッチを行います。
$ xa ' "apple"./pp(.)/.1 '
# l
正規表現オブジェクトの関数呼び出し#
正規表現オブジェクトを関数として呼び出した場合、マッチ演算子と同じ動作をします。
$ xa ' /pp(.)/("apple").1 '
# l