正则表达式匹配某些单词但不是特定组合

时间:2014-06-10 21:47:23

标签: regex

我有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.

如何解决这个问题?

由于

3 个答案:

答案 0 :(得分:4)

您可以将此正则表达式与negative lookahead

一起使用
^(?!.*?(?:just-tests?|nice)).*?themeA.*$

Working Demo

答案 1 :(得分:2)

选项1

您可以使用带有前瞻的单个正则表达式(请参阅online demo):

^(?!.*nice?)(?!.*just-tests?).*themeA.*
  1. ^断言匹配从字符串的开头开始(因此我们不匹配字符串的子集
  2. (?!.*nice?)是一个负向前瞻,断言在字符串中的这个位置,我们找不到任何字符,后跟nice
  3. (?!.*just-tests?)是一个负向前瞻,断言在字符串中的这个位置,我们找不到just-test后面的任何字符和一个可选的s
  4. 作为进一步的调整,您可以使用|替换将前瞻压缩为一个,如anubhava的答案。

    没有前瞻的选项2(Perl,PHP / PCRE)

    ^(?:.*(?:nice|just-tests?).*)(*SKIP)(?!)|.*themeA.*
    

    这个没有使用前瞻,但只是跳过不需要的标题。请参阅demo

答案 2 :(得分:0)

为了清晰和简单,使用两种不同的正则表达式。

将您的字符串与一个与themeA匹配的正则表达式匹配:

/themeA/

然后检查字符串是否与您不想要的字符串匹配:

/nice|just-tests?/

使用两个不同的正则表达式可以更容易理解和维护。