(?!...)ブロックの手前に式があり、手前の正規表現式に一致するが、否定先読みのパターンに一致しない場合に一致したと判定されます。正規表現で指定したパターン以外のパターンに一致する正規表現の式を紹介します。
正規表現で全体のパターンの中の一部のパターンにマッチした場合以外をマッチさせたい場合があります。
単体の文字の場合は ^ を利用しますが、パターンを否定したい場合、パターン以外のものにマッチさせたい場合には、「否定後読み」を利用すると実装できます。
(?<!パターン)
?<!を記述します。
通常は、ブロックの後に式が続くため、次の形式となります。
(?<!パターン)パターン
(?!...)ブロックの手前に式があり、手前の正規表現式に一致するが、否定先読みのパターンに一致しない場合に一致したと判定されます。123のパターンに一致しますが、abc123 は除外したいです。
この場合、以下の正規表現式を利用します。abc123以外の 123の文字列に一致します。
(?<!abc)123
置換文字列を"OK"とした場合、次の結果になります。
| 文字列 | マッチするか | 置換後の文字列 |
|---|---|---|
| a123 | 〇 | aOK |
| b123 | 〇 | bOK |
| c123 | 〇 | cOK |
| abc123 | × | abc123 |
| abc1234 | × | abc1234 |
| Xabc1234 | × | Xabc1234 |
| aba123 | 〇 | abaOK |
| XYZabc123PQR | × | XYZabc123PQR |
置換の場合は、否定先読みのブロック部分はマッチ範囲ととなりません。 置換文字列を"xyz"とした場合、次の結果になります。
| 文字列 | マッチするか | 置換後の文字列 |
|---|---|---|
| a123 | 〇 | axyz |
| b123 | 〇 | bxyz |
| c123 | 〇 | cxyz |
| abc123 | × | abc123 |
| abc1234 | × | abc1234 |
| Xabc1234 | × | Xabc1234 |
| aba123 | 〇 | abaxyz |
| XYZabc123PQR | × | XYZabc123PQR |
abc123 xyz123 以外のパターンにマッチさせたいです。
この場合、以下の正規表現式を利用します。複数のパターンのORをとる場合は|演算子を利用します。
(?<!abc|xyz)123
置換文字列を"OK"とした場合、次の結果になります。
| 文字列 | マッチするか | 置換後の文字列 |
|---|---|---|
| a123 | 〇 | aOK |
| c123 | 〇 | cOK |
| abc123 | × | abc123 |
| Xabc1234 | × | Xabc1234 |
| aba123 | 〇 | abaOK |
| XYZabc123PQR | × | XYZabc123PQR |
| x123 | 〇 | xOK |
| z123 | 〇 | zOK |
| xyz123 | × | xyz123 |
| Axyz1239 | × | Axyz1239 |
| xz123 | 〇 | xzOK |
| xyz987 | × | xyz987 |
ponta 以外の *ta にマッチする正規表現式は次の通りです。
(?<!pon)ta
置換文字列を"OK"とした場合、次の結果になります。
| 文字列 | マッチするか | 置換後の文字列 |
|---|---|---|
| penta | 〇 | penOK |
| ponta | × | ponta |
| pnta | 〇 | pnOK |
| printa | 〇 | prinOK |
| poronta | 〇 | poronOK |
| zponta | × | zponta |
| 3ponta | × | 3ponta |
| anapontap | × | anapontap |
| petita | 〇 | petiOK |
| ota | 〇 | oOK |