2010-03-08 75 views
60

我知道以下正则表达式匹配“红色”,“绿色”或“蓝色”。匹配除指定字符串以外的所有内容

red|green|blue 

有没有使其符合一切除了几个指定的字符串的简单方法?

+1

并非所有的正则表达式都可以做到这一点。你在哪个环境工作? Java的? Perl的? 。净?一些C/C++正则表达式库?一个RDBMS? – FrustratedWithFormsDesigner

+5

你不会说你想要什么,但你可以简单地颠倒“匹配”操作的感觉。如果你尝试对不匹配的部分进行提取,但是为了测试一个被排除的字符串是否不存在,它会起作用:'if(!s.match(/ red | green | blue /)) ......注意:我知道OP没有指定什么语言/框架,所以前面的内容应该被认为是一个通用的例子,而不是一个规范性的例子。 – tvanfosson

回答

28

取决于语言,但一般也有负的断言,你可以把像这样:

(?!red|green|blue) 

(谢谢你的语法修正,上面是有效的Java和Perl,因人而异)

+2

你的意思是'(?!red | green | blue)'。 –

+1

@caskey,完整答案是我和你的组合。如果您想将它们合并在一起,我会删除我的。 –

+4

这个答案会更有用,你解释一下。例如:什么“?”和“!”意思?为什么你需要捕获组? – Lii

87

如果你想确保字符串不是红色,绿色和蓝色,caskey的答案就是它。然而,通常想要的是确保线路中的任何地方不包含红色,绿色或蓝色。对于这一点,在负先行锚定的正则表达式与^,包括.*

^(?!.*(red|green|blue)) 

此外,假设你想包含单词“引擎”,但行没有任何这些颜色:

^(?!.*(red|green|blue)).*engine 

你可能会认为你可以在因素对.*正则表达式的头部:

^.*(?!red|green|blue)engine  # Does not work 

但你可以不。你必须有.*这两个实例才能工作。

+1

@Russ谢谢你指出错误。我编辑了答案。我用一些括号固定了它,但是用'。*'多余的副本修复也很好。但是,我不相信尾随。*是必要的。 –

+0

如果你只是想要一个匹配的布尔检查,尾随。*是不需要的。如果你真的想要完整的匹配文本,你确实需要它。另外...您的新解决方案非常干净。谢谢! – Russ

5

我有同样的问题,提出的解决方案几乎工作,但他们有一些问题。最后,我使用的正则表达式是:

^(?!red|green|blue).* 

我在Javascript和.NET中测试它。 *(?!。* red | green | blue),否则它会使第一个元素的行为与其他元素不同(即“anotherred”不会与其他元素的行为不同(例如,“anotherred”不会与其他元素的行为有所不同)当“anothergreen”会匹配时)

15

您不需要负面预测。有工作示例:

/([\s\S]*?)(red|green|blue)/g 

描述:

  • [\s\S] - 从0匹配来自先前组
  • ?到无限 - - 的任何字符
  • *匹配匹配尽可能少
  • (red|green|blue) - 匹配其中一个词
  • g - 重复模式

例子:

redwhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredwhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredredgreenredgreenredgreenredgreenredgreenbluewhiteredbluewhiteredbluewhiteredbluewhiteredbluewhitered

将是:

whitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhite

测试:regex101.com

注意到1155个步骤,但如果有人能即兴我会很感激。

+1

如果你解释了模式的工作原理,这个答案会更好。 – Lii

+0

@Li我不知道这种模式需要解释什么。这是基本的正则表达式。 – hlcs

+4

您可以通过交换点[\ s \ S]来大幅减少步数。我非常困惑,为什么看起来每个其他的例子都会单独捕获每个单词。这种方法稍微多一些正则表达式步骤,但需要少得多的后处理。 – Zatronium

5

匹配任何东西,但给出的字符串

如果你想,你想匹配的一切,但某些字符串匹配整个字符串,你可以做这样的:

^(?!(red|green|blue)$).*$

此说,开始从字符串开始的匹配,它不能以红色,绿色或蓝色开始并以红色,绿色或蓝色结尾,并与字符串末尾的其他任何内容匹配。

你可以在这里尝试一下:https://regex101.com/r/rMbYHz/2

注意,这仅与正则表达式引擎支持negative lookahead工作。

相关问题