web-dev-qa-db-ja.com

JavaScriptで正規表現を反転するにはどうすればよいですか?

文字列Aがあり、別の文字列Bがその一部ではないかどうかをテストしたい。これは非常に単純な正規表現であり、結果は後で逆にすることができます。

私はそれをできた:

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

その後、次のように反転します。

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

私が抱えている問題は、結果ではなく正規表現内でそれを行う必要があるということです。何かのようなもの:

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

(機能しません)

言い換えると、正規表現は存在しないことをテストし、その場合はtrueを返す必要があります。

これはJavaScriptで可能ですか?

44
acme

試してください:

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

(短い)説明:

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

したがって、単純な英語では、文字列「foobar」が「見える」場合、その正規表現は文字列の先頭から検索します。 「見える」場合はno *が一致します。

*negative先読みだから一致なし!

この先読みに関する詳細: http://www.regular-expressions.info/lookaround.html ただし、JavaScriptは先読みのみをサポートしており、look -behindsはサポートしていません=!

61
Bart Kiers
^(?!.*(Word1|Word2|Word3))

Word1Word2、またはWord3のいずれも含まない文字列に一致します(リストを無制限に拡張できます)。ただし、これはヌル文字列にも一致します。 nullsを拒否するには

^(?!$)(?!.*(Word1|Word2|Word3))  
2
thing241

不等式の例を次に示します。最初に演算子「<」を分離し、後でオペランド「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'

追伸:オペランドの完全一致を取得するために、逆表現に空白を追加しました。

1
Sandro Rosa

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

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

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

0
Brian Kelly