否定の正規表現について
「〜を含まない」といった、否定の意味を持つ正規表現を記述する場合、下記のように、大きく分けて2種類のケースがあります。
「特定の1文字を含まない」といった否定表現か、もしくは「正規表現パターンを含まない」といった表現かで、大きく解決の方針が異なる点に注意して下さい。
さて、「空白文字以外」の例でしたが、他にもいくつかの「〜以外の一文字」を表すエスケープシーケンスが存在します。目的に応じてうまく利用することで、正規表現をシンプルに記述できるでしょう。
表現
|
意味
|
\s
|
空白文字(半角スペース、\t、\n、\r、\f)すべての文字。( |\t|\n|\r|\f)と同義
|
\S
|
空白文字以外のすべての文字
|
\d
|
数字。[0-9]と同義
|
\D
|
数字以外の文字列。[^0-9]と同義
|
\w
|
すべてのアルファベットとアンダースコアのうち任意の一文字。[a-zA-Z0-9_]と同義
|
\W
|
すべてのアルファベットとアンダースコア以外の1文字[^a-zA-Z0-9_]と同義
|
\l
|
すべての半角英小文字のうち1文字
|
\L
|
すべての半角英小文字の以外の文字1文字(英大文字、数字、全角文字など含む)
|
\u
|
すべての半角英大文字のうち1文字
|
\U
|
すべての半角英大文字以外の1文字(英小文字、数字、全角文字など含む)
|
これ以外のエスケープシーケンスに関しては、こちらの記事もご覧ください:
名前
|
表現
|
詳細
|
否定先読み
(Negative lookahead)
|
(?!
pattern
)
|
開始位置から前を読んで、pattern がマッチしなければテストはパス
|
否定後読み
(Negative lookbehind)
|
(?<!
pattern
)
|
開始位置から後ろを読んで、pattern がマッチしなければテストはパス
|
肯定先読み
(Positive lookahead)
|
(?=
pattern
)
|
開始位置から前を読んで、pattern がマッチすればテストはパス
|
肯定後読み
(Positive lookbehind)
|
(?<=
pattern
)
|
開始位置から後ろを読んで、pattern がマッチすればテストはパス
|
上記の中でも、特に否定先読み・戻り読みは、利用すると非常に多様な正規表現が可能になります。ぜひマスターしてみて下さい。今回紹介した、否定先読み、否定戻り読みに関しては、こちらにも詳しくまとめています。
【補足】.htaccess では、 否定のパターンに「!」が使える
もしあなたが、正規表現を .htaccess でリダイレクト処理のために記述しているならば、朗報です。mod_rewrite エンジンで、RewruteCond や RewriteRule を記載する際には、正規表現パターンの否定を表すことが出来てしまいます。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/about
RewriteRule (.*) http://example.com/$1 [R=301,L]
</IfModule>
.htaccess による、リダイレクト設定にかんしてです:
アパッチのドキュメントにも言及があります。
また、今回1行を対象にするように「^」「$」のアンカーを利用しました。一般的な正規表現については、こちらを御覧ください。
こちらは、文書全体を処理する時の表現です。
基本的な正規表現については、こちらにまとまっています。
「〜にマッチしない」の正規表現が書きたいよ〜