JavaScriptでの正規表現の備忘録

##正規表現
JSでの正規表現の備忘録です。

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

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

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


##記述式

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


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

###アンカー($, ^)
|項目|値|
|---|---|
|役割|ある式の出現位置を固定する機能|
|先頭検索|先頭のから場合は^を指定する。（集合演算子外の場合）|
|末尾検索|末尾のから場合は$を指定する|

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

###文字クラス（バックスラッシュ）
|項目|値|
|---|---|
||改行や数字全部、英数字全部などはエスケープ キャラクターを使用し記述する|

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

###選択肢（パイプ）
|項目|値|
|---|---|
|1|複数の選択肢はパイプ（&#124;）を使って記述する|

###後方参照グループ化（括弧演算子＋数字）
|項目|値|
|---|---|
||バックスラッシュの後に数字を入れるとキャプチャを指定することができる。|
||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文字`なので注意！

```python

>>> 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

###

###特徴
|項目|値|
|---|---|
|1|コンパイル時、正規表現はJavaScriptエンジンによって構文解析され内部表現に変換される。|
|2|賢明なブラウザなら同じ表現はキャッシュするがそれは、そのブラウザが採用しているエンジンに依存する|
|3|同じ表現でも別のユニークなオブジェクトとして表現される。ここが他のプリミティブオブジェクト（文字や数値）などと違う所。|

##使い方

###RegExp.Test関数
|項目|値|
|---|---|
|1|マッチしたかを論理値で返す|

###String.Match関数
|項目|値|
|---|---|
|内容|マッチ結果を配列で返す。|
|ローカル正規表現|デフォルトの正規表現。最初のマッチした結果の配列を返す。その時、マッチの内側も返す。|
|グローバル正規表現|フラグのgがついた正規表現。グローバルマッチ（マッチが成立した全ての候補）を返す。その時、マッチの内側は返さない。|

###RegExp.Exec関数
|項目|値|
|---|---|
|内容| 同じ実行を同じ変数に格納するたびに結果が変わる（次のグローバルマッチを返す）。戻り値の内容はローカルマッチを配列で返す。|
|ローカル正規表現|Whileでループするとエラー|
|グローバル正規表現|配列が返る。結果はWhileでループするとグローバルマッチの内側のマッチを配列で返す。つまり、全て参照可能。|

###String.Search関数
|項目|値|
|---|---|
|内容|一致する文字列が見つかった場合、search メソッドは、最初に見つかった文字列の、先頭からのオフセットを示す整数値を返します。見つからなかったら-1を返す|


###Array.Split関数
|項目|値|
|---|---|
|内容|ある文字列で配列を区切る。正規表現リテラルでも指定が可能。|

##Reference
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp