^ の利用方法はこちらの記事を参照してください。正規表現で特定のパターンを除外したパターンで一致する式を紹介します。
正規表現で全体のパターンの中で除外したいパターンを除いた一部のパターンに一致させたい場合があります。
単体の文字の場合は ^ を利用しますが、パターンを否定したい場合には、「否定先読み」を利用すると実装できます。
(?!パターン)
?! を記述します。
通常は、ブロックの前に式がおかれるため、次の形式となります。
パターン(?!パターン)
(?<!...)ブロックの後ろに式があり、否定先読みのパターンに一致しないが、後に続く式に一致した場合に一致したと判定されます。"PenguinBook"以外の"Penguin*" に一致させたいです。この場合、以下の正規表現式を利用します。
Penguin(?!Book)
次の結果になります。
| 文字列 | マッチするか |
|---|---|
| PenguinArt | 〇 |
| PenguinCookie | 〇 |
| PenguinBook | × |
| PenguinJump | 〇 |
| DuckArt | × |
| DuckBook | × |
| CookPenguinArt | 〇 |
| CookPenguinBook | × |
置換の場合は、否定先読みのブロック部分はマッチ範囲ととなりません。 置換文字列を"Hawk"とした場合、次の結果になります。
| 文字列 | マッチするか | 置換後の文字列 |
|---|---|---|
| PenguinArt | 〇 | HawkArt |
| PenguinCookie | 〇 | HawkCookie |
| PenguinBook | × | PenguinBook |
| PenguinJump | 〇 | HawkJump |
| DuckArt | × | DuckArt |
| DuckBook | × | DuckBook |
| CookPenguinArt | 〇 | CookHawkArt |
| CookPenguinBook | × | CookPenguinBook |
&#x(16進数); 以外の & にマッチさせたいです。この場合、以下の正規表現式を利用します。
&(?!#x[0-9a-fA-F]*;)
置換文字列を"&"とした場合、次の結果になります。
| 文字列 | マッチするか | 置換後の文字列 | 補足 |
|---|---|---|---|
| J | × | J | |
| ⽈ | × | ⽈ | &#x2F48; |
| &#xZZZ; | 〇 | &#xZZZ; | |
| ģ | 〇 | &#x123 | 末尾のセミコロンがないためマッチする |
| Penguin&Docuk | 〇 | Penguin&Docuk | |
| &Opt | 〇 | &Opt | |
| #AA09; | × | #AA09; |
&#x(16進数); &#X(16進数); &#(10進数); を除く & にマッチするパターンは以下の式になります。
&(?!#((x|X)[0-9a-fA-F]*;|[0-9]*;))