2010-12-13 7 views
2

HTMLスクリプトタグと一致する正規表現パターンがあります。このスクリプトタグパターンを変更して、パターンが "入力文字列がスクリプトタグパターンと一致しない"ことを意味するようにするにはどうすればよいですか?正規表現:パターンが含まれていない/

つまり、パターンを指定すると、パターンの意味を「このパターンと一致しません」に変更するために必要な変更は何ですか?

たとえば、パターンが\d{3}-\d{3}-\d{4}の場合、「\d{3}-\d{3}-\d{4}と一致しません」という意味のパターンは何ですか?

+0

エラー...なぜ簡単な 'somestring!="

3

正規表現パターンを否定するには、否定先読みを使用します。これは単に正規表現を否定するのとは少し異なります。否定先読みは、Java(および他の多くの言語)で次のようになります。

(?!\d{3}-\d{3}-\d{4}) 

これは正確に質問に答えていないことに留意すべきです。正規表現の逆数を見つけることは、正規表現を使うのは簡単な作業ではありません(私は思っていません)。この問題を解決する方がはるかに簡単な方法は、プログラムロジックを反転するために、次のようになります。

の代わりに:

if (string.matches(yourRegex)) 

の操作を行います。

if (!string.matches(yourRegex)) 
+0

私はそれを考えなかった! –

+0

@ElR、私はそれが最善の解決策だとは思わない。しかし、それはOPが尋ねた質問に答える。 – jjnguy

+0

もちろん、これは実際にはOPsオリジナルのマッチではない文字列に「一致」しません。しかし、私は彼らが達成しようとしていることを知らない。 @ElR、 –

1

任意のパターンのために容易に達成されていないこと。実際には、ほとんどの場合、パターン自体よりも周囲のコードで必要なことを行う方が簡単です。例えば、代わりに

grep '\d{3}-\d{3}-\d{4}' file 

のために、あなたは

grep -v '\d{3}-\d{3}-\d{4|' file 

を使用することができますまたはプログラムにあなたには

if (!pattern.matches()) { 
    foo(); 
} 

のようなものに

if (pattern.matches()) { 
    foo(); 
} 

のようなものを変更することができますもっと退屈なアプローチ、あなたは一致してはならないものの代わりに、と一致する可能性のあるすべての値を列挙する必要があります。 「さて、あなたは任意の文字が、 『<』、またはあなたを一致させることができます:正規表現は言ってようなものであることを読ん

([^<]|<([^h]|h([^t]|t([^m]|m([^l]|l[^>]))))) 

:あなたは、文字列<html>以外のすべてを一致させたいと言うので、あなたがそうのような正規表現を書くことができ'<'と一致する可能性がありますが、その後に 'h'をマッチさせることはできません。それ以降は 'h'にマッチしますが、その後は 't'とマッチできません。 。

単純な文字列一致の場合は、任意のタームを上記のようなパターンに変換する再帰関数を簡単に書くことができます。

0

あなたはどの言語を使用していますか?あなたが明示した特定の問題に対する最も簡単な解決法は、単純に否定演算子(通常は "!")をマッチに付加することです。

0

私は間違いなくあなたは試合のためにテストを否定すべきであると言って他の回答に同意するが、これはあなただけの正規表現を使用して欲しいものを行う必要があります。

(?!.*\d{3}-\d{3}-\d{4}) 

これは否定先読みで、任意の文字を配置しないことにより、先読みの外では、正規表現は基本的には「正規表現\d{3}-\d{3}-\d{4}」の後に任意の文字数(.*)で始まる文字列で失敗することを意味します。

関連する問題