2

文字列内の位置に関係なく、文字列に2つ以上の値があるかどうかを確認したい. たとえば、正規表現で「OR」の条件が必要な場合は、次のようにします。

/(a|b)/.test("a") // true

しかし、必要なのは「AND」です。このようなもの:

/(a&b)/.test("a") // false
/(a&b)/.test("b") // false
/(a&b)/.test("a b") // true
/(b&a)/.test("a b") // true
/(a&b&c)/.test("a b") // false
/(a&b&c)/.test("a c b") // true

明らかに、この構文は正しくありません...

これらの値abcなどは配列から取得されます。と の組み合わせを使用してみましたeval()indexOf(a) !== -1 && indexOf(b) !== -1、遅すぎたため、正規表現を使用しています。

4

3 に答える 3

2

次のように実行できます。

/(?=.*a)(?=.*b)/.test("a")
于 2012-10-12T16:21:59.260 に答える
1

@OmarJackman が投稿した回答は、あなたが求めていることを行います。ただし、彼のソリューションでは、単純な正規表現よりも多くの処理を必要とするルックアラウンドが使用されていることに注意してください。優れたパフォーマンスを求めている場合は、2 つの個別の正規表現を実行することをお勧めします (ケースのテストとケースのテストa) b。特に検索テキストが大きくなると、2 つの単純な正規表現は 1 つの複雑な正規表現よりも桁違いに速く実行されます。

編集:コメントに記載されているように、「桁違い」はパフォーマンスへの影響の不当な誇張ですが、パフォーマンスは関係なく考慮する必要があります。

于 2012-10-12T16:25:49.880 に答える
1

固定文字列を照合しているので、次を使用できます。

function matchAll(str, arr)
{
  for (var i=0; i<arr.length; ++i) {
    if (str.indexOf(arr[i]) === -1) {
      return false;
    }
  }
  return true;
}

matchAll('a', ['a']); // true
matchAll('a', ['a', 'b']); // false
matchAll('a b', ['a', 'b']); // true
matchAll('a b c', ['a', 'b']); // true
matchAll('a b', ['a', 'b', 'c']); // false
matchAll('a c b', ['a', 'b', 'c']); // true
matchAll('c a b', ['a', 'b', 'c']); // true

固定文字列を探している場合は.indexOf()、正規表現よりも高速になります。

于 2012-10-12T19:55:03.663 に答える