排除某些模式?

时间:2012-10-24 15:58:24

标签: regex

我有以下模式

Administrator        yes
User                 yes
Userb                yes
userc                yes
userd                yes

我想要一个匹配,当有任何用户后面跟着是(在他们之间有任意数量的空格)不是Admin,User和Userb

我尝试过负面的前瞻和消极的后视。例如,对于Administrator的情况,我已经尝试过这个

(?<!Administrator)\s+yes

然而,与管理员的行仍然匹配,我怀疑是因为\ s +。非常感谢,谢谢。

2 个答案:

答案 0 :(得分:2)

你的假设是正确的。 \s+只会匹配一个空格(例如!),然后此空格不会以Administrator开头,而是由另一个空格开头。这不容易解决,因为只有在.NET中允许将\s+包含在负面的后观中(其他正则表达式引擎无法处理可变长度的外观)。

但是,如果您使用多线模式(如何激活它取决于您的语言/工具),那么您可以使用否定前瞻:

^(?!Administrator|User|Userb)\w+\s+yes

在多线模式下,^将在每一行的开头匹配。

更新:事实上,在写完这篇文章之后,我确实想出了一个使用lookbehind的解决方案。只需确保在一堆单词字符后立即执行lookbehind:

\w+(?<!Administrator|User|Userb)\s+yes

现在\s+必须匹配所有空格,否则它们不会以字符开头。

请注意,对于非前缀免费用户,这两种解决方案都存在问题。第一个与用户Userbob不匹配,而第二个与ThatUser不匹配。这可以使用单词边界来解决:

^(?!(?:Administrator|User|Userb)\b)\w+\s+yes
\w+(?<!\b(?:Administrator|User|Userb))\s+yes

答案 1 :(得分:0)

这有效:

^(?!Administrator|User).*yes   

http://www.rubular.com/r/ijyZT0Eaas