如何用正则表达式匹配中间为and、cat和dog位置可互换的三个词
解决精准匹配"cat"、"and"、"dog"且"and"居中的正则问题
我懂你要的是严格让"cat"和"dog"分别在"and"两侧,顺序可以互换的场景,你之前的正向环视只保证了两个词都存在,但没约束它们和"and"的位置关联对吧?
直接给你能满足需求的正则表达式:
^(?:\bcat\b\s+\band\b\s+\bdog\b|\bdog\b\s+\band\b\s+\bcat\b)$
拆解一下这个正则的逻辑:
^和$锚点确保匹配整个字符串(如果是在长文本里找片段,可以去掉这两个锚点)(?:A|B)是一个非捕获组,用来覆盖两种合法的顺序:\bcat\b\s+\band\b\s+\bdog\b:匹配 "cat" 在前,后跟任意数量空白字符,接着是"and",再跟任意空白字符,最后是"dog"\bdog\b\s+\band\b\s+\bcat\b:匹配 "dog" 在前,中间是"and",最后是"cat"
\b是单词边界,避免误匹配像"catty"或者"doggy"这类包含目标词的其他单词\s+匹配一个或多个空白字符(如果允许零空白,比如"catanddog",可以改成\s*)
如果需要允许三个词之间有非空白的分隔符(比如标点),可以把\s+改成\W+,这样就能匹配像"cat, and dog"或者"dog - and - cat"这类场景,调整后的正则:
^(?:\bcat\b\W+\band\b\W+\bdog\b|\bdog\b\W+\band\b\W+\bcat\b)$
内容的提问来源于stack exchange,提问作者Eradicator_1729




