Help us understand the problem. What is going on with this article?

正規表現で論理積(AND)を実現する

More than 5 years have passed since last update.

論理和(OR)の場合

ORは簡単にできます。例えば'apple'または'orange'が含まれているかどうか調べる場合は以下のようになります(コードはJavaScript)。

/apple|orange/

論理積(AND)の場合

ANDは、例えば'apple''orange'の両方が含まれているかどうか調べる場合は以下のようにすればいいらしいです。

/^(?=.*apple)(?=.*orange)/

なんで!?

(?=)は位置指定子というものの一つで、x(?=y)としたときは、'x''y'が続く場合のみ'x'にマッチします(肯定先読み)。
つまり、あくまでも位置を指定しているというわけです。
上の例の場合、まず先頭をスタート位置とし、^(先頭)→.*(何かしらの文字が0回以上)→appleと続いているかチェックします。さらにまた先頭から、^(先頭)→.*(何かしらの文字が0回以上)→orangeと続いているかチェックします。

順を追って見ていくと、

"lemon, apple, grape, orange"

という文字列があったときに、^の時点でlの前にマッチします。

"【ここ】lemon, apple, grape, orange"

次に(?=.*apple)の時点で、lemon, appleがそれに該当します。

"【ここから】lemon, apple【ここまで】, grape, orange"

さらにその位置に対して、(?=.*orange)が成立するか見ます。

"【ここから】lemon, apple, grape, orange【ここまで】"

.*の部分はlemon, apple, grape,にあたり、その後orangeが出てきて、この文字列(の先頭)は/^(?=.*apple)(?=.*orange)/にマッチするということになります。

これを利用して、3つ以上のANDを表現するのにも使えます。

/^(?=.*apple)(?=.*orange)(?=.*peach)/.test("lemon, apple, grape, orange"); //false
n4o847
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした