Regex 正则表达式和运算符
基于这个答案 我试了一下,但没能成功。我错过了什么?javascript不支持它吗 正则表达式:Regex 正则表达式和运算符,regex,and-operator,Regex,And Operator,基于这个答案 我试了一下,但没能成功。我错过了什么?javascript不支持它吗 正则表达式:(?=foo)(?=baz) 字符串:foo,bar,baz不可能同时匹配(?=foo)和(?=baz)。它要求下一个字符同时是f和b,这是不可能的 也许你想要这个: (?=.*foo)(?=.*baz) 这意味着foo必须出现在任何地方,而baz必须出现在任何地方,不一定按该顺序出现,也可能重叠(尽管在这种特定情况下不可能重叠,因为字母本身不重叠)。可能只是一个OR运算符|就足以解决您的问题:
(?=foo)(?=baz)
字符串:
foo,bar,baz
不可能同时匹配(?=foo)
和(?=baz)
。它要求下一个字符同时是f
和b
,这是不可能的
也许你想要这个:
(?=.*foo)(?=.*baz)
这意味着
foo
必须出现在任何地方,而baz
必须出现在任何地方,不一定按该顺序出现,也可能重叠(尽管在这种特定情况下不可能重叠,因为字母本身不重叠)。可能只是一个OR运算符|
就足以解决您的问题:
字符串:foo、bar、baz
正则表达式:(foo)|(baz)
结果:
[“foo”,“baz”]
也许你正在寻找类似的东西。如果您想选择同时包含“foo”和“baz”的完整行,此正则表达式将符合以下要求:
*(foo)+.*(baz)+|.*(baz)+.*(foo)+.
布尔(AND)加通配符搜索的示例,我在javascript自动完成插件中使用该示例:
要匹配的字符串:“我的单词”
要搜索的字符串:“我正在搜索文本中的有趣单词”
您需要以下正则表达式:/^(?=.*my)(?=.*word)。*$/im
解释:
^在行首断言位置
?=正向前瞻
*匹配任何字符(换行符除外)
()组
$在行尾断言位置
i修改器:不敏感。不区分大小写的匹配(忽略[a-zA-Z]的大小写)
m修改器:多行。使^和$匹配每行的开始/结束(不仅仅是字符串的开始/结束)
在此处测试正则表达式:
因此,您可以创建一个javascript函数:
函数fullTextCompare(myWords,toMatch){
//替换正则表达式保留字符
myWords=myWords.replace(/[-\/\\^$*+?.()\[\]{}]/g,\\$&');
//在空格处拆分字符串
arrWords=myWords.split(“”);
//将您的单词封装在正则表达式组中
arrWords=arrWords.map(函数(n){
返回[“(?=*”+n+”)];
});
//创建正则表达式模式
sRegex=newregexp(“^”+arrWords.join(“”+“*$”,“im”);
//执行正则表达式匹配
返回(toMatch.match(sregx)==null?false:true);
}
//使用它:
console.log(
fullTextCompare(“我的单词”,“我正在搜索本文中有趣的单词”)
);
//通配符:
console.log(
fullTextCompare(“ywo”,“我正在搜索本文中的有趣单词”)
);代码>我刚试过。没有雪茄。也许这是regexpal的一个bug?@ghee22:正则表达式工作得很好,但使用regexpal可能不是测试它的最佳方法,因为没有关于匹配是否成功的可见反馈(它是零宽度匹配)。请尝试在Javascript控制台中运行它,或者在表达式末尾添加*
。这在Javascript中肯定有效,但在regexpal.com中不起作用。问题是关于和逻辑。如果只有一个或另一个单词存在,则带有交替的OR逻辑(|
)也将匹配,这不是目的-两者都必须存在。@mklement0您完全正确。我只提供了一个可能也有用的选择。