2010/08/11
[正規表現]「ある文字列が存在するとマッチしない」正規表現
正規表現は便利なのですが、「ある文字列が存在したときはマッチしない」という正規表現を書くのはちょっと考えないとできないと思います。今回考えてみたので使ってみてください。
^(?!.*【文字列】)
PowerShellによる使用例。「test」という文字列が含まれているとFalseになる。
PS C:\Users\daisuke> "test" -match "^(?!.*test)" False PS C:\Users\daisuke> "testAAA" -match "^(?!.*test)" False PS C:\Users\daisuke> "AAAtest" -match "^(?!.*test)" False PS C:\Users\daisuke> "AAAtestAAA" -match "^(?!.*test)" False PS C:\Users\daisuke> "AAAtestAAAtestAAA" -match "^(?!.*test)" False PS C:\Users\daisuke> "AAA" -match "^(?!.*test)" True PS C:\Users\daisuke> "" -match "^(?!.*test)" True
このようにちゃんと動きます。
この正規表現の意味は、「文頭があるとマッチする。ただし、あとに0文字以上の何かの文字およびtestという文字列が続く場合はマッチしない」となります。評価対象になる文字列には必ず文頭が存在するので^が基本的にはすべてマッチするのですが、後に否定の先読み(?!・・・)をつけてマッチする条件を絞っているのがポイントです。
なお、【文字列】の部分は、任意の正規表現も使用可能です。正規表現の否定、論理反転ができるわけですね。
正規表現の否定の先読み(?!・・・)は処理系によっては使えないそうです。.NET、VBScript、JavaScript、Perl、PHPなんかの最近のバージョンでは大丈夫みたいです。
なんでもかんでも正規表現にしなくても、コードを書いてやれば大抵のことは解決します。この例でも、"test"のマッチ結果を論理否定すれば求める結果は得られます。ですが正規表現でしかプログラムの機能を拡張できないケースというのもよくありますよね。TwitterクライアントのNG処理とか。そういうときに使えばいいんじゃないかなと思います。
元記事:http://blogs.wankuma.com/mutaguchi/archive/2010/08/11/192221.aspxプライバシーポリシー