2011-12-22 11 views
7

私は、ネゲートしたい正規表現を持っています。 String.matchesを返しJavaの正規表現を否定する方法

/(.{0,4}) 

"/1234" true 
"/12" true 
"/" true 
"" false 
"1234" false 
"/12345" false 

結果であるように、上記の(REGXのみ使用して)否定する方法はあります:

"/1234" false 
"/12" false 
"/" false 
"" true 
"1234" true 
"/12345" true 

私は」正規表現全体を書き直すことなく、どのregxでも動作するような一般的な解決法を探しています。

私は以下を見てきました: How to negate the whole regex?(?!パターン)を使っていますが、それは私にとってはうまくいかないようです。

次REGX

(?!/(.{0,4})) 

は、次の値を返します。私が欲しいものではありません

"/1234" false 
"/12" false 
"/" false 
"" true 
"1234" false 
"/12345" false 

を。 ご協力いただければ幸いです。

+4

一致しているかどうかを照合して否定することはできませんか?これは、正規表現を書き換えない任意の正規表現の汎用ソリューションです。 –

+2

このマッチングコーディングは、他のものを壊すことなく変更することができない既存のフレームワークの一部です。 – Wayne

答えて

22

アンカーを追加する必要があります。元の正規表現(マイナス不要な括弧):

/.{0,4} 

は... は4文字以上にゼロが続くスラッシュが含まれていることを文字列にマッチします。あなたがmatches()メソッドを使用しているので、それは本当にであるかのようしかし、自動的に、固定されます:

^/.{0,4}$ 

はその逆を達成するために、あなたは自動アンカーに頼ることはできません。ルックアヘッド内で少なくともエンドアンカーを明示的にする必要があります。

(?!/.{0,4}$).* 

しかし、私はあなたが明示的に全体の正規表現を固定することをお勧めします、そのような:: matches()は文字列全体を消費するために正規表現を必要とするので、あなたは「パッド」に .*で正規表現をも持っている

^(?!/.{0,4}$).*$ 

それは害を及ぼさず、特にPerlやJavaScriptのような他の味から正規表現を学んだ人に、あなたの意図を完全にはっきりさせます。 matches()メソッドの自動アンカーは非常に珍しいです。

+0

これはどんな正規表現でも動作しますか?すなわち、 'String negateRegex(String regex){return"(?! "+ regex +" $)。* "; } '期待どおりに動作しますか?これはそれ自身を否定することができますか?すなわち 'negateRegex(negateRegex(regex))'は機能的に 'regex'と同じでしょうか? – Mark

+0

ええと、私はここでいくつかの予備テストを行っていますが、否定を否定するなど、私が試したすべてのケースで動作しているようです。 [1] http://www.regexplanet.com/advanced/java/index.html – Mark

+0

文字列のような正規表現を操作することはできません。あなたは\ Qと\ Eを考慮しますか?あなたは最後にバックスラッシュを考慮しますか? – ntysdd