如何使用正则表达式在字符串任意位置匹配多个任意顺序的模式?
匹配任意顺序多模式的正则表达式写法
要同时匹配多个任意顺序的子串,最常用的方案是正向肯定预查(Positive Lookahead),这种写法简洁且兼容性好。
比如你需要匹配同时包含foo、bar、bat和baz的字符串(顺序不限),对应的正则表达式可以写成:
^(?=.*foo)(?=.*bar)(?=.*bat)(?=.*baz).*$
拆解说明:
^和$:锚定整个字符串的开头和结尾,确保我们匹配的是完整字符串(如果不需要匹配整个串,可以去掉这两个锚点)(?=.*foo):正向预查,检查字符串中存在foo子串,.*用来跳过foo之前的任意字符- 每个
(?=.*xxx)都独立检查对应子串的存在,彼此互不干扰,所以子串的出现顺序不影响匹配结果 .*$:匹配预查通过后剩下的所有字符(如果用了锚点,这部分是必须的,否则正则只做检查不会匹配内容)
额外注意事项:
- 如果需要不区分大小写匹配,可根据正则引擎添加对应修饰符,比如JS中写成:
/^(?=.*foo)(?=.*bar)(?=.*bat)(?=.*baz).*$/i - 如果要匹配的子串包含正则特殊字符(比如
.、*、?等),需要用反斜杠\转义,比如匹配foo.bar要写成(?=.*foo\.bar)
内容的提问来源于stack exchange,提问作者cat pants
相关产品推荐
相关产品推荐

