我正在从输入中进行一些基本的文本匹配。我需要能够执行基本的“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;
}
似乎应该很容易。
答案 0 :(得分:6)
使用lookahead。试试这个:
if( inputArray.length>1 ) rgx = "(?=.*" + inputArray.join( ")(?=.*" ) + ").*";
你最终会得到像
这样的东西(?=.*dog)(?=.*cat)(?=.*mouse).*
只有在所有单词出现时才匹配,但它们可以以任何顺序。
但不是
它的工作方式是正则表达式引擎从当前匹配点(0)扫描,查找.*dog
,第一个子正则表达式(任意数字的任意数字,然后是 dog )。当它确定该正则表达式的真实性时,它会重置匹配点(返回0)并继续下一个子正则表达式。因此,网络是每个单词的位置并不重要;只有找到每个单词。
.*
,我在上面添加了。没有它,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)|(?!))
不保证这会按原样运作,但这是我认为的基本想法。看看我对复杂的意思?