根据这个答案
我在 http://regexpal.com/ 上尝试了以下内容,但无法使其工作。我错过了什么?JavaScript 不支持它吗?
正则表达式:(?=foo)(?=baz)
字符串:foo,bar,baz
根据这个答案
我在 http://regexpal.com/ 上尝试了以下内容,但无法使其工作。我错过了什么?JavaScript 不支持它吗?
正则表达式:(?=foo)(?=baz)
字符串:foo,bar,baz
无法同时匹配 (?=foo)
和 (?=baz)
,因为这将需要下一个字符同时是 f
和 b
,这是不可能的。
也许你想要的是:
(?=.*foo)(?=.*baz)
这意味着foo
和baz
可以出现在任何地方,不一定按顺序,可能会重叠(尽管在这种情况下字母本身不会重叠)。
一个布尔(AND)加通配符搜索的示例,我正在使用它作为javascript自动完成插件:
要匹配的字符串:"my word"
要搜索的字符串:"我正在搜索这段文本中的有趣的单词"
您需要以下正则表达式:/^(?=.*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)+|.*(baz)+.*(foo)+.*
foo,bar,baz
正则表达式:(foo)|(baz)
结果:["foo", "baz"]
|
)的OR逻辑也会匹配,即使只有一个或另一个单词存在,这并不是意图 - 必须同时存在两个单词。 - mklement0
.*
。 - Mark Byers