2016-08-24 4 views
1

テスト対象の文字列に 'foo'が含まれておらず、 'bar'が含まれておらず、 'baz'が含まれていない場合はtrueを返すJavaScript RegExpオブジェクトを作成する必要があります'NOT fooのJavaScript RegExpとNOT bar and NOT baz

これは一般的な考えです...私は大きな結果セットを持っています。私は一連のRegExp.test()を使ってフィルタリングしてフラットマップする一連の関数チェーンを実行する必要があります。

結果は次のようになります。「foo」を含む文字列のすべてと

  1. 1つのサブセット。
  2. 'bar'を含むすべての文字列の1つのサブセット。
  3. 'baz'を含むすべての文字列を含む1つのサブセット。
  4. のすべて(すなわち、前の正規表現のテストの を失敗していましたもの。)

と1つのサブセットは、私が持っている1 -3完璧に取り組んでいます。それは私が問題を抱えている#4を行うための良い方法を見つけることです。私は、述語が返すフィルタを実行しようとしました

(false === fooRegex.test(result) && false === barRegext.text && false == bazRegex.test) 

だけでなく、いくつかの偽陽性を取得します。私が何をしたいか

は、以下の擬似コードのようなものです:事前に

var myRegex = new RegExp('!foo && !bar && !baz', 'gi') 

感謝!

+0

正規表現についての質問がある場合は、これについて書いてみた正規表現を表示できますか?いくつかの否定的な先読みは機能しません – TankorSmash

+1

* JavaScript RegExpはNOT fooであり、NOT bar and not baz * - '/ ^(?![\ s \ S] *(?: foo | bar | baz))[ S] * $/' –

+3

存在をテストして否定するだけではどうですか? '!string.match(/(foo | bar | baz)/)'? – meagar

答えて

0

これはそれを行う必要があります。

var arr = 
[ 
'fooyay', 
'baryay', 
'yaybazyay', 
'yay', 
'blah', 
'awesome', 
'fooxyz', 
'barxyz' 
] 

var fooRegex = /foo/gi 
var barRegex = /bar/gi 
var bazRegex = /baz/gi 

var ih = [] 
for(var x=0;x<arr.length;x++) 
{ 
    var result = arr[x] 
    if(!fooRegex.test(result) && !barRegex.test(result) && !bazRegex.test(result)) 
    { 
     ih.push(result) 
    } 
} 

document.getElementById('out').innerHTML = ih.join('<br>') 

は、それはあなたが探している各項目をテストし、何も見つからなかった場合は、「アウト」の要素に表示されるリストに追加されます。

3

De Morgan's lawsを使用してください。否定のつながりは、論理和の否定です。

!string.test(/foo|bar|baz/i); 
0

助けてくれた皆様に感謝します。 fooではなく、バー、NOT AND NOTバズのため

JavaScriptの正規表現:

/^(?![\s\S]*(?:foo|bar|baz))[\s\S]*$/ 
が、私はそうのようにこれを実装:

は、私がコメントでWiktor第Stribiżewによって投稿ソリューションを使用

var catchAllRegExp = new RegExp(/^(?![\s\S]*(?:foo|bar|baz))[\s\S]*$/, 'gi') 

ここでは、単にプレディカにcatchAllRegExp.test(result)を使用します.filter()に渡された関数です。

UPDATE:

私はバベル/ WebPACKのでES6で働いています。しかし、ES5では、上記の構文は次のエラーがスローされます:正規表現のフレームの直後にフラグを置く

TypeError: Cannot supply flags when constructing one RegExp from another 

はこれを解決します

var catchAllRegExp = new RegExp(/^(?![\s\S]*(?:foo|bar|baz))[\s\S]*$/gi) 

はしかし、私はそれが速記を使用するためにさらに良いことだと思います。

var catchAllRegExp = /^(?![\s\S]*(?:foo|bar|baz))[\s\S]*$/gi; 

もう一度おねがいします!

関連する問題