【发布时间】:2010-06-14 22:13:22
【问题描述】:
基于这个答案
Regular Expressions: Is there an AND operator?
我在http://regexpal.com/ 上尝试了以下操作,但无法正常工作。缺少什么? javascript不支持吗?
正则表达式:(?=foo)(?=baz)
字符串:foo,bar,baz
【问题讨论】:
标签: regex and-operator
基于这个答案
Regular Expressions: Is there an AND operator?
我在http://regexpal.com/ 上尝试了以下操作,但无法正常工作。缺少什么? javascript不支持吗?
正则表达式:(?=foo)(?=baz)
字符串:foo,bar,baz
【问题讨论】:
标签: regex and-operator
(?=foo) 和 (?=baz) 不可能同时匹配。这将要求下一个字符同时是f 和b,这是不可能的。
也许你想要这个:
(?=.*foo)(?=.*baz)
这表示foo 必须出现在任何地方,baz 必须出现在任何地方,不一定按那个顺序并且可能重叠(尽管在这种特定情况下重叠是不可能的,因为字母本身不重叠)。
【讨论】:
.* 添加到表达式的末尾。
我在 javascript 自动完成插件中使用的布尔 (AND) 加通配符搜索示例:
要匹配的字符串:"my word"
要搜索的字符串:"I'm searching for my funny words inside this text"
您需要以下正则表达式:/^(?=.*my)(?=.*word).*$/im
解释:
^ 在行首断言位置
?=正向预测
.* 匹配任何字符(换行符除外)
() 组
$在行尾断言位置
i 修饰符:不敏感。不区分大小写的匹配(忽略 [a-zA-Z] 的大小写)
m 修饰符:多行。使 ^ 和 $ 匹配每行的开始/结束(不仅是字符串的开始/结束)
在这里测试正则表达式:https://regex101.com/r/iS5jJ3/1
因此,您可以创建一个 javascript 函数:
例子:
function fullTextCompare(myWords, toMatch){
//Replace regex reserved characters
myWords=myWords.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
//Split your string at spaces
arrWords = myWords.split(" ");
//Encapsulate your words inside regex groups
arrWords = arrWords.map(function( n ) {
return ["(?=.*"+n+")"];
});
//Create a regex pattern
sRegex = new RegExp("^"+arrWords.join("")+".*$","im");
//Execute the regex match
return(toMatch.match(sRegex)===null?false:true);
}
//Using it:
console.log(
fullTextCompare("my word","I'm searching for my funny words inside this text")
);
//Wildcards:
console.log(
fullTextCompare("y wo","I'm searching for my funny words inside this text")
);
【讨论】:
也许您正在寻找类似的东西。如果要选择同时包含“foo”和“baz”的完整行,则此 RegEx 将遵守:
.*(foo)+.*(baz)+|.*(baz)+.*(foo)+.*
【讨论】:
也许只是一个 OR 运算符 | 就足以解决您的问题:
字符串:foo,bar,baz
正则表达式:(foo)|(baz)
结果:["foo", "baz"]
【讨论】:
|) 的 OR 逻辑也将匹配,这不是意图 - both 必须存在。