添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
玩足球的手术刀  ·  II-VI ...·  4 月前    · 
低调的风衣  ·  【转】C# ...·  4 月前    · 
狂野的毛豆  ·  decoding json in ...·  1 年前    · 

否定の正規表現について

「〜にマッチしない」の正規表現が書きたいよ〜

なるほど、良い質問じゃな!ところで、おぬしの考えている条件は、1文字か?それとも、2文字以上の文字列のパターンか・・?

え〜っと・・・。

「〜を含まない」といった、否定の意味を持つ正規表現を記述する場合、下記のように、大きく分けて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行を対象にするように「^」「$」のアンカーを利用しました。一般的な正規表現については、こちらを御覧ください。

こちらは、文書全体を処理する時の表現です。

基本的な正規表現については、こちらにまとまっています。