[英]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.