繁体   English   中英

正则表达式“AND”

[英]Regular Expression “AND”

我正在从输入中进行一些基本的文本匹配。 我需要能够执行基本的“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;
}

好像它应该很容易。

使用前瞻 尝试这个:

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

你最终会得到类似的东西

(?=.*dog)(?=.*cat)(?=.*mouse).*

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

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

但不是

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

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

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

做一个简单的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
    }
}

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

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

如果你正在寻找“ABC”(按顺序,连续),表达式只是/ABC/ 完成!

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

如果你正在寻找“B foo A foo C”你最好为/A//B//C/做三个单独的测试

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM