正規表現の書き方¶
Category: 正規表現
ssu の regex_ で始まる関数(regex_match regex_find regex_findall regex_count regex_replace regex_replace_first regex_erase regex_erase_first regex_split regex_escape)に共通する、パターン・オプション・結果の取り出し方をまとめます。Mc203-1以降。
正規表現エンジンは DEELX です。Perl や .NET に近い書式で、\d \w \s、[a-z]、* + ? {n,m}(? を付けると最短一致)、|、(...)、(?:...)、(?<名前>...)、\1、^ $ \b、先読み・後読み((?=...) (?!...) (?<=...) (?<!...))などが使えます。文字は Unicode のまま扱うので、ひらがな・漢字も 1 文字として一致します(. や [^a] など)。ただし \w \d \s と \b は ASCII の範囲だけが対象で、(regex_match、日本語、^\w+$) は 0 です。日本語の範囲は [ぁ-ん] [ァ-ヶ] [一-龠] のように書きます。
里々の中で書くときの注意¶
パターンの中の \ や半角の ( ) はそのまま書けます。全角の ( ) は里々の記法として先に解釈されるので、文字として使いたいときは φ( φ) と書きます(前処理)。、 は引数の区切りになります。
オプション¶
関数の最後の引数(省略可)に、次の文字を並べて指定します。大文字でも同じです。空白と , は無視されます。
| 文字 | 意味 |
|---|---|
i |
大文字小文字を区別しない |
s |
. が改行にも一致する |
m |
^ と $ が行頭・行末に一致する(指定しないと文字列の先頭・末尾) |
x |
パターン中の空白とコメント(# から行末まで)を無視する |
それ以外の文字を書くと 正規表現のオプションが正しくありません(i, s, m, x が使えます)。(エラー)になります。
パターンの中で (?i) (?s) (?m) と書いても指定できます。(?i) はそこから後ろに効きます(A(?i)B は A を区別して、B は区別しません)。
グループの番号¶
一致した部分は、(S0) が全体、(S1) 以降が括弧のグループです(regex_match、regex_find で入ります)。番号は開き括弧の順です。
名前付きグループ (?<名前>...) は、名前の付かないグループより後ろに番号が付きます(.NET と同じ)。(?<w>\w+) (\w+) では、(S1) が 2 つめの (\w+)、(S2) が w です。番号に頼らず ${名前} で参照するほうが安全です。
置換後の書き方¶
regex_replace などの「置換後」で使えます。
| 書き方 | 意味 |
|---|---|
$1 $2… |
その番号のグループ |
${名前} |
名前付きグループ |
$& |
一致した部分全体 |
$` |
一致した部分より前 |
$' |
一致した部分より後ろ |
$_ |
対象の文字列全体 |
$$ |
$ 自身 |
注意¶
- 正規表現の書式のエラーは報告されません。閉じていない括弧などは、エンジンが解釈できる範囲で解釈され、エラーにはなりません。パターンは実機で確かめてください。
- 空文字列に一致するパターンでも、1 文字ずつ進むので止まらなくなることはありません(
(regex_count、abc、)は4)。 - 複雑なパターンで一致の探索に時間がかかることがあります(入れ子の
*など)。外部から来た文字列をパターンにするときは、regex_escape を通してください。