正規表現
#オートマトン
メモ
非決定性有限オートマトンに変換できる
/icons/point.icon正規表現は非決定性から決定性にリファクタリングすること(可能であれば)
実装よりも理論が先に登場している(SQLも理論から先にできている)
有限オートマトンなのでチューリング不完全
概要
正規表現には文字にマッチするものと位置にマッチするものがある
「先/後読み、^,$,/b,/A,/z」などは位置にマッチするものになる。
バックトラック
非決定性有限オートマトンにした時に「同じ入力値で複数の異なる状態に遷移できる分岐」ができる場合は、分岐を試してダメだったら分岐元まで戻って別の分岐を試す挙動になる
同じ入力値に複数の状態遷移がある非決定性を持つ場合は計算量が膨大になる
ReDoS
正規表現の演算
選択
連接
繰り返し
発展的な演算 発展的な演算は正規(オートマトンで受理可能)ではないものもある
先読み・後読み  先読み・後読みでできることは正規表現の基本3演算でできる。
後方参照 <([^>]*)>.*?</\1> このようにhtmlタグにマッチできる。
再帰
table:チートシート
. 任意の文字
^ 行頭にマッチ。位置にマッチするタイプ
$ 文末にマッチ。位置にマッチするタイプ
括弧の中のどれか。abcdとしたらa,b,c,dのどれか
^ []の中で^を最初に入れると否定の意味になる。^abcの場合はabc以外にマッチ。
* 直前の文字の0以上の繰り返し。{0,}
+ 直前の文字の1以上の繰り返し。{1,}
? 直前の文字があってもなくても良い。{0,1}
| または。a|b、aかbか。
() 文字のグループをつくる。(abc)+としたらabcの1回以上の繰り返しになる。
{n} 直前のn回の繰り返し
{min, max} min以上max以下の繰り返し。 ? = {0, 1}の意味
{min, } min以上の繰り返し。 * = { 0, } + = {1, } の意味
{min, max}? 繰り返しに対して?がつくと、できるだけ最小でマッチしようとする。 *? +? ?? {10}? など
\w アルファベット、数字、アンダースコアのどれかにマッチ
\W \w以外のものにマッチ
\d 数字1文字にマッチ
\D \d以外のものにマッチ
\s 半角スペース、タブ、改行にマッチ
\S \s以外にマッチ
\n 改行
\t タブ
\b 単語境界にマッチ。位置にマッチするタイプ
\B \b以外の位置にマッチ。位置にマッチするタイプ
(?= ) 先読み
(?! ) 否定の先読み
(?<= ) 後読み
(?<! ) 否定の後読み
ちょい使える正規表現
private以外の文字で始まる行にマッチ
^[^(private)].*$
空行のみ検出
(?<=^)\r\n
""の中の文字をキャプチャ
"(?<=")(.*?)(?=")"
数字にカンマを入れる (位置にマッチなので、後読み先読みを使う
(?<=\d)(?=(\d{3})+($|\D))
以下を利用すれば ,を挿入することができる
s/(?<=\d)(?=(\d{3})+($|\D))/,/g
Javaプログラムのコメント削除
/* */ と //の二つのタイプのコメントがある
/* */タイプ
\/\*(.|\s)*?\*\?
//タイプ
(?<!https:)(?<!http:)\/\/(?!.*\/\/).*
perlで動かしてみる
cat targetfile.java | perl -pe 's/(?<!https:)(?<!http:)\/\/(?!.*\/).*//;' | perl -0pe 's/\/\*(.|\s)*?\*\///g;' > result.java
#便利
#小技