正規表現の肯定先読み、否定先読み、肯定戻り読み、否定戻り読みが簡便すぎた真実・・・ただのオプション設定だった・・・

2段階で指定できる正規表現、というのに気づくと、とても簡単で便利な機能でした。

正規表現でマッチする箇所、というのは使っていると簡単になってきます。
肯定先読みなどは、「マッチ箇所のオプション設定」でしかありません。

順番で書くとわかりやすいのですが、
STEP1.目的の文字列にマッチする正規表現を書く(基本)
STEP 2.実は1.でマッチした箇所、その直前の文字列が○○のときが本当の目的の文字列(肯定戻り読み)
以上。

という感じで、オプション設定のような、レイヤーといいますかフィルター方式でマッチする文字列を設定していける、といった記述になります。

簡単な例ですが、郵便番号にマッチするにしても "〒\d{3}-\d{5}" に対して
STEP1.マッチしたいものは "\d{3}-\d{5}"
STEP2.実は、直前の文字が "〒" のもの
これを "(?<=〒)\d{3}-\d{5}" と書けます。(肯定戻り読み)

なぜ正規表現にこのような機能があり、「〒\d{3}-\d{5}」でもよさそうなところ2段階のものの違いはというと、具体的にはC#ではMatch系で違いが出てきます。
これはマッチした場所の場所も得ることができるので大変便利です。このとき、「〒」の文字を含めるか含めないか、というのをマッチした後に処理するのか、正規表現で記述しておけるか、という違いがあります。
個人的には可能な限り正規表現に含めることができた方が、1年後にソースを見直すときに思い出しやすいのでお勧めです。
なので、〒マークを含めるなら"〒\d{3}-\d{5}"、含めないなら"(?<=〒)\d{3}-\d{5}"とすることで、STEP1.の「\d{3}-\d{5}」についてだけ開始位置などが得られる一方で、STEP2.の〒マークはオプション設定扱いなので含まれない、という結果になります。

また、"(?<=〒)\d{3}-\d{5}"という書き方の一方でグループ指定「(\d{3}-\d{5})」があります。
この場合先ほどのが"(?<=〒)(\d{3}-\d{5})"となってしまいます、あくまで「(?<=〒)」はオプション設定
なので最初のグループは「(\d{3}-\d{5})」になります。(.Net 4.5)



とくに便利なのが(否定戻り読み)になると思うのですが、電話番号ではない、と指定したいケースです。
郵便番号は〒が抜けていて234-5678だけのケースがあるが、電話番号123-4567、TEL123-4567 のようになっているとすると、"\d{3}-\d{5}"に追加のオプション設定:否定戻り読み (?<!電話番号|TEL) を前に付けて
"(?<!電話番号|TEL)\d{3}-\d{5}" とするだけです。

さらにマッチを厳格にしたいとして、次の文字が北海道または沖縄県または東京都に限定したい、というケースでは オプション設定:肯定先読み (?=北海道|沖縄県|東京都) を後ろに付けて
"(?<!電話番号|TEL)\d{3}-\d{5}(?=北海道|沖縄県|東京都)"とするだけです。