正则表达式“AND”

时间:2009-08-21 14:56:30

标签: javascript regex

我正在从输入中进行一些基本的文本匹配。我需要能够执行基本的“AND”。对于“ANY”,我用空格分割输入,并用管道(“|”)字符连接每个单词,但我还没有找到一种方法来告诉正则表达式匹配任何单词。

switch (searchOption) {
  case "any":
    inputArray = input.split(" ");
    if (inputArray.length > 1) { input = inputArray.join("|"); }
    text = input;
    break;
  case "all":
    inputArray = input.split(" ");
    ***[WHAT TO DO HERE?]***
    text = input;
    break;
  case "exact":
    inputArray = new Array(input);
    text = input;
    break;
}

似乎应该很容易。

4 个答案:

答案 0 :(得分:6)

使用lookahead。试试这个:

if( inputArray.length>1 ) rgx = "(?=.*" + inputArray.join( ")(?=.*" ) + ").*";

你最终会得到像

这样的东西
(?=.*dog)(?=.*cat)(?=.*mouse).*

只有在所有单词出现时才匹配,但它们可以以任何顺序

  • 狗吃了吃老鼠的猫。
  • 老鼠被狗和猫吃掉了。
  • 大多数猫喜欢老鼠和狗。

但不是

  • 老鼠的狗。
  • 像小鼠一样的猫和狗。

它的工作方式是正则表达式引擎从当前匹配点(0)扫描,查找.*dog,第一个子正则表达式(任意数字的任意数字,然后是 dog )。当它确定该正则表达式的真实性时,它会重置匹配点(返回0)并继续下一个子正则表达式。因此,网络是每个单词的位置并不重要;只有找到每个单词。

编辑:@Justin指出我应该有一个尾随.*,我在上面添加了。没有它,text.match(regex)可以正常工作,但regex.exec(text)会返回一个空匹配字符串。使用尾随.*,您将获得匹配的字符串。

答案 1 :(得分:3)

执行一个简单的for循环并搜索每个术语,如下所示:

var n = inputArray.length;
if (n) {
    for (var i=0; i<n; i++) {
        if (/* inputArray[i] not in text */) {
            break;
        }
    }
    if (i != n) {
        // not all terms were found
    }
}

答案 2 :(得分:3)

“和”的问题是:你想要的是什么组合?它们可以按任何顺序出现,还是必须按照给定的顺序出现?它们可以连续出现还是之间可以有其他单词?

这些决定会严重影响您的搜索(或搜索)。

如果您正在寻找“A B C”(按顺序连续),表达式只是/A B C/。完成!

如果您正在寻找“A foo B bar C”,则可能是/A.*?B.*?C/

如果您正在寻找“B foo A foo C”,那么最好为/A//B//C/进行三项单独的测试

答案 3 :(得分:1)

我的正则表达式cookbook确实具有正则表达式,可以使用条件来完成此操作。但是,它非常复杂,所以我会选择当前最受欢迎的答案,它会迭代选项。无论如何,试图调整他们的例子我认为它会是这样的:

\b(?:(?:(word1)|(word2))(\b.*?)){2,}(?(1)|(?!))(?(2)|(?!))

不保证这会按原样运作,但这是我认为的基本想法。看看我对复杂的意思?