正規表現

記法

項目
1正規表現リテラル(/expression/)
2文字列リテラル('expression')をRegExpのコンストラクタへ

エスケープキャラクタ

項目
バックスラッシュがエスケープ文字\
一つと2つの違い1つは正規表現リテラル、2つは文字表現リテラル
バックスラッシュ+記号往々にして記号のエスケープ
バックスラッシュ+文字列往々にして定義済み文字列(文字クラス)
バックスラッシュ+数字往々にして後方参照

フラグ

項目
i(case insensitive)大文字小文字区別なし
g(case global)ローカルパターンでは最初の出現だけマッチするが、グローバルパターンではパターンの全ての出現にマッチする
m(multiple lines)複数行にマッチする
挿入方法正規表現リテラルの場合はスラッシュの後に挿入する。文字列リテラルの場合はRegExpの第二引数に文字列リテラルで挿入する

記述式

項と演算子

項目
式(expression)項と演算子で表現する
項(term)/test/だと4つの項がある。つまり、一文字がひとつの項
演算子(operation)記号やバックスラッシュなど

集合演算子(角括弧)

項目
集合演算子とは角括弧([])で表現する。各括弧の中は候補文字列(どれか一つにマッチさせたい文字列)を入れる。それが、一つの項となる
候補文字列角括弧の中に入れる[abc]の中のどれかにマッチさせたい時に使う
キャレット(^)ある文字列以外のマッチなら集合演算子の直後にキャレット(^)をつける。(集合演算子内の場合)
ダッシュ(-)[a-m]だとaからmまでの、辞書順のすべての文字を指定している
エスケープ(\)エスケープをすると特殊文字列($など)を候補文字列として指定することができる

アンカー($, ^)

項目
役割ある式の出現位置を固定する機能
先頭検索先頭のから場合は^を指定する。(集合演算子外の場合)
末尾検索末尾のから場合は$を指定する

繰り返し演算子(算術演算子など)

項目
?演算子ある項が1個あってもなくてもいい場合は?記号を対象項の末尾に指定する
+演算子ある項が一回以上の繰り返しの場合は+記号を対象項の末尾に指定する
*演算子ある項がゼロ回以上の繰り返しの場合は*演算子を対象項の末尾に指定する
波括弧演算子(引数一つ)ある項の繰り返し回数を指定する場合は、波括弧({})で記述し、第一引数にその回数を指定する
波括弧演算子(引数2つ)ある項の繰り返し回数の範囲を指定する場合は、波括弧({})で記述し、第一引数に下限、第二引数に上限を指定する。
Note: 上限を省略するには、{4, }のような形で指定する
欲張りと控えめな記述デフォルトは欲張りで、欲張りだとマッチする全てのパターンを検索する。控えめだと最小限のマッチの検索のみをする。
“aaa”という文字列を対象とし、/a+?/の場合は、a+を満足させるため、ただ一個のa文字にマッチする(?は最小量指定子)。

文字クラス(バックスラッシュ)

項目
改行や数字全部、英数字全部などはエスケープ キャラクターを使用し記述する

グループ化(括弧演算子+記号|文字)

項目
2つの役割がある。複数項のグループ化とキャプチャ指定である。
グループ化とは何か?括弧演算子を使って複数の項を一つの項にする。/(ab)+/などはabの一回以上の繰り返しを意味する
キャプチャ正規表現の一部に括弧を入れてグループ化すると作られるもの。後方参照できるようになる
受動的な部分式
キャプチャしない括弧(?:x)のように「?:」をグループに指定するとindexから参照できなくなる。($1などで)

選択肢(パイプ)

項目
1複数の選択肢はパイプ(|)を使って記述する

後方参照グループ化(括弧演算子+数字)

項目
バックスラッシュの後に数字を入れるとキャプチャを指定することができる。
XMLなどのマッチをする時に使う

先読み/後読み (lookahead, lookbehind)

意味
(?<=東京)東京が先に入っている(positive lookahead)
(?<!東京)東京が先に入っていない(negative lookahead)
(?=東京)東京が後に入っている(positive lookbehind)
(?!東京)東京が後に入っていない(negative lookbehind)

例: (?<=東京)(?<!大阪)特許(?=許可)(?!許諾)

東京特許許可局 <=== Matched
東京特許許諾
大阪特許許可局
大阪特許許諾

特殊文字

https://cloud.google.com/dataprep/docs/html/Supported-Special-Regular-Expression-Characters_57344771?hl=en

特殊文字の\w\w matches any word character (equal to [a-zA-Z0-9_]) とあるが、この [a-zA-Z0-9_]はあくまで英語の話で、日本語の場合は全角文字、半角カナ、半角英数字またはアンダースコア1文字なので注意!


>>> import re
>>> x = re.search("\w", "日本語")
>>> x
<re.Match object; span=(0, 1), match='日'>

https://www.translatejapan.com/translation/news/index3_2.php?no=131

Reference

  • https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp
  • http://www.htmq.com/js/RegExp_global.shtml