正規表現メモ
処理の流れ
◆文字列 「1234567890」 から 「\d*:」 パターンを抜き出す場合の流れ
- パターン「\d*」に一致する文字列を探す。この場合は全文字列が一致する。一致した文字列はステートに入る
- 次に「:」に一致する文字列を探そうとするが、全文字列が一致しているのでチェック対象が無い状態。そこで既に一致した文字列の末尾から1文字づつ戻って「:」のチェックをする*1
- 前処理の結果「:」に一致する文字列が存在しなかったので、結果は不一致となる。
アトミックなチェック
◆同じく、文字列 「1234567890」 から 「\d*:」 パターンを抜き出す場合の流れ
- パターン「\d*」に一致する文字列を探す。この場合も全文字列が一致する。ただし、一致してもステートには入らない。
- 次に「:」に一致する文字列を探そうとするが、全文字列が一致しているのでチェック対象が無い状態。ステートには何も存在しないので、この時点で不一致が確定する。
量指定子
◆チェック文字列
◆最小一致
?pattern
例)「Cond.*?Setting」とすると、左から下記の4カ所がヒットする。
- CondSetting
- CondSetting
- CondName>設定001
001 - CondSetting
◆最大一致
指定しない場合、最大一致となる。
例)「Cond.*Setting」とすると、下記の1カ所がヒットする。
- CondSettings>
設定001 001
いろいろなパターン
パターン | 解説 | 使用例 | 解説 |
---|---|---|---|
(?=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:バックトラック