正規表現メモ

処理の流れ

◆文字列 「1234567890」 から 「\d*:」 パターンを抜き出す場合の流れ

  1. パターン「\d*」に一致する文字列を探す。この場合は全文字列が一致する。一致した文字列はステートに入る
  2. 次に「:」に一致する文字列を探そうとするが、全文字列が一致しているのでチェック対象が無い状態。そこで既に一致した文字列の末尾から1文字づつ戻って「:」のチェックをする*1
  3. 前処理の結果「:」に一致する文字列が存在しなかったので、結果は不一致となる。

アトミックなチェック

◆同じく、文字列 「1234567890」 から 「\d*:」 パターンを抜き出す場合の流れ

  1. パターン「\d*」に一致する文字列を探す。この場合も全文字列が一致する。ただし、一致してもステートには入らない。
  2. 次に「:」に一致する文字列を探そうとするが、全文字列が一致しているのでチェック対象が無い状態。ステートには何も存在しないので、この時点で不一致が確定する。

量指定子

◆チェック文字列
設定001001

◆最小一致

?pattern

例)「Cond.*?Setting」とすると、左から下記の4カ所がヒットする。

  • CondSetting
  • CondSetting
  • CondName>設定001001
  • CondSetting
◆最大一致

指定しない場合、最大一致となる。
例)「Cond.*Setting」とすると、下記の1カ所がヒットする。

  • CondSettings>設定001001

いろいろなパターン

パターン 解説 使用例 解説
(?=pattern) patternがこの位置の右側に存在する場合にマッチ(肯定の先読み) ん(?=に) => こにちはこんちには
(?!pattern) patternがこの位置の右側に存在しない場合にマッチ(否定先読み) ん(?!に) => こんにちはこちには
(?<=pattern) patternがこの位置の左側に存在する場合にマッチ(肯定戻り読み) (?<=ん)に => こんちはこんちんこにちは
(?<!pattern) patternがこの位置の左側に存在しない場合にマッチ(否定戻り読み) (?<!ち)ん => こんにちはこにちんこにちは
(?>pattern) マッチ文字列に対するバックトラックを禁止する (?>.*): => 「1234567890:」では該当なし。 .*ですべての文字列にマッチする。次に:のチェックを行うが、アトミックなチェックの為バックトラックが行われない。その為、このチェックは失敗する。
(?:pattern) キャプチャしないグルーピング。$nで取得できない。文字列のor判定する時などに使用する。 <(?:A HREF="|IMG SRC=")(.+)" <A HREF="http://WWW.YAHOO.CO.JP" /><IMG SRC=".\sample.jpg"/>  から、属性値だけを抽出する。

*1:バックトラック