我有15个标题如下:
fruits-and-flowers-themeA
fruits-and-flowers-themeB
fruits-and-flowers-just-test-themeA
themeAfruitsandflowers
nice-fruits-and-flowers-themeA
botanical-names-themeA
我想要一个正则表达式来帮助我只使用" themeA"在它们中,但它不应该包含" nice"并且不包括" just-test"或者"只是测试"。
我试过
^(?!.*just-test|*just-tests|nice).*?(?:themeA).*,
但我仍然在输出中获得了水果和鲜花 - 只是测试主题A.
如何解决这个问题?
由于
答案 0 :(得分:4)
答案 1 :(得分:2)
选项1
您可以使用带有前瞻的单个正则表达式(请参阅online demo):
^(?!.*nice?)(?!.*just-tests?).*themeA.*
^
断言匹配从字符串的开头开始(因此我们不匹配字符串的子集(?!.*nice?)
是一个负向前瞻,断言在字符串中的这个位置,我们找不到任何字符,后跟nice
(?!.*just-tests?)
是一个负向前瞻,断言在字符串中的这个位置,我们找不到just-test
后面的任何字符和一个可选的s
作为进一步的调整,您可以使用|
替换将前瞻压缩为一个,如anubhava的答案。
没有前瞻的选项2(Perl,PHP / PCRE)
^(?:.*(?:nice|just-tests?).*)(*SKIP)(?!)|.*themeA.*
这个没有使用前瞻,但只是跳过不需要的标题。请参阅demo。
答案 2 :(得分:0)
为了清晰和简单,使用两种不同的正则表达式。
将您的字符串与一个与themeA匹配的正则表达式匹配:
/themeA/
然后检查字符串是否与您不想要的字符串匹配:
/nice|just-tests?/
使用两个不同的正则表达式可以更容易理解和维护。