2009-10-08 38 views
33

私は文字列Aを持っていて、別の文字列Bがその一部でないかどうかをテストしたい。これは非常に の単純正規表現で、その結果を後で逆転することができます。JavaScriptで正規表現を反転させるにはどうすればよいですか?

私が行うことができます:

/foobar/.test('[email protected]') 

をし、その後、それを反転し、次のように:

!(/foobar/).test('[email protected]') 

私が持っている問題は、私は自分で正規表現の中でそれを行うことなくする必要があること、です結果。言い換えれば

(動作しない)
/!foobar/.test('[email protected]') 

:ような何か正規表現は非存在をテストし、その場合にはtrueを返す必要があります。

これはJavaScriptでも可能ですか?

答えて

44

試してみてください。

/^(?!.*foobar)/.test('[email protected]') 

A(ショート)説明:文字列 'foobarには' できる場合

^   # start of the string 
(?!  # start negative look-ahead 
    .*  # zero or more characters of any kind (except line terminators) 
    foobar # foobar 
)   # end negative look-ahead 

ので、平易な英語で、その正規表現は文字列の先頭から検索します"見た"。 「見る」ことができる場合は、 *と一致します。

※ノーマッチだからネガティブルックアウェイ!

この先読みの詳細について:http://www.regular-expressions.info/lookaround.htmlしかし、JavaScriptでは先読みのみがサポートされていますが、見た目はサポートされていません。behinds

+0

ニース - それを説明できますか? – jantimon

+0

Thx私は見たことがありませんか?前。素晴らしい答え – jantimon

+0

これはまさに私が必要としていたものです。前にJavaScriptで否定的な先取りを試みていない。どうもありがとう! – acme

0

あなたが本当に探しているのは「foobarに」のような単純な文字列よりも複雑ではない場合:

if (yourString.indexOf("foobar") === -1) { 
    // ... 
} 

http://www.w3schools.com/jsref/jsref_indexOf.asp

+0

ありがとう、しかし、それは正規表現である必要があります、私はちょうど例を少し簡略化しました。 – acme

+0

またはyourString.includes( "foobar"):) – rogerdpack

0
^(?!.*(word1|word2|word3)) 

はいずれも含まない文字列にマッチしますword1word2、またはword3です(リストを無期限に拡張することもできます)。 しかし、これもヌル文字列と一致します。 nullを拒否するには

^(?!$)(?!.*(word1|word2|word3)) 
1

ここでは不等式の例を示します。 最初にオペレータ '<'を分離し、後でオペランド 'a'と 'b'を分離します。 基本的に、私は直接式を取り、それを右括弧に入れ、後者を '^'で逆変換し、最後に結果の式を角括弧に埋め込みます。 '^'は最初とは違って解釈されるためです。

var _str = "a < b" ; 
var _op = /</g ; 
var _no_op = /[^(<|\)]/g ; 
console.log(_str, _str.match(_op)); // get '<' 
console.log(_str, _str.match(_no_op)); // get 'a', 'b' 

P.sは:私は、オペランドの正確なマッチングを取得するために、逆の表現に空白を追加しました。

関連する問題