正規表現基本

^
行頭(改行コードの後でもマッチする)

$
行末(改行コードの前でもマッチする)

\A
文字列の先頭にマッチ(改行コードの後ではマッチしない)

\Z
文字列の末尾にマッチ(改行コードの前ではマッチしない)
(文字列の最後が改行の場合のみ改行コードの前でマッチする)

\z
文字列の最後も含め改行コードの前ではマッチしない

.
任意の1文字(改行は除くmオプションで改行含む)

|
または

( )
グループ化

文字クラス

[ ]
文字クラス(文字集合)


文字クラス内で範囲

^
文字クラス内で先頭のみ否定(文字集合以外の文字という意味)

数量子

*
0以上(?で最短マッチ)

+
1以上(?で最短マッチ)

?
0 か 1 か

{m,n}
m から n(片方を省略すると以上、以下)

メタ文字

\s
空白(\Sは空白以外)

\n
改行

\t
タブ文字

\w
文字(\Wは文字以外)

\d
数字(\D数字以外)

走査の順番

文字列:abcdefgab
パターン:cf

走査の順番は、走査される文字列(abcdefgab)の先頭(a)から
パターンと照合し、ダメなら次の文字列のbからパターンと照合。
文字列のcまでくると、パターンのcとマッチするので、
パターンは次のfに行く。
そこで、文字列がbでパターンがfなのでマッチが失敗。
走査の対象にパターンと同じ組み合わせがでてこないとダメ。

先読み

先読みはアンカーで位置にマッチする。
もとの走査とは別の走査で、マッチしたら継続。マッチしなければ終了。

肯定先読み
(?=xxx)
否定先読み
(?!xxx)
肯定後読み
(?<=xxx)
否定後読み
(?<!xxx)

実験(電話番号)

(?=(?:\d-?){10}$|\d{3}-\d{4})(\d{2,5})-(\d{1,4})-(\d{4}$)
の場合
(?=(?:\d-?){10}$|\d{3}-\d{4})
まで先読み。

まずこのマッチは?:を(?:はメモリしない意)外して考える。
(\d-?){10}
これはハイフンは無視して数字が10連続しているかどうか。
NG 123456789
NG 123456789a
NG 123456789a0
OK 1234567-8-9-0
OK 1234567890
OK 123456789-0

\d{3}-\d{4}
を追加して、
(\d-?){10}|\d{3}-\d{4}
とすると。
OK 123-4567
NG 1234-567
NG 12-34567

この先読みでマッチした場合のみ、後ろの、
(\d{2,5})-(\d{1,4})-(\d{4}$)
へ走査が続く。

実験(カンマ区切り)