2012-10-24 99 views
3

我有追踪图形排除某些模式?

Administrator  yes 
User     yes 
Userb    yes 
userc    yes 
userd    yes 

我想,当有任何用户,然后是一个匹配(与它们之间的空间的任意数量的)不是管理员,用户,和用户B

我曾尝试过负面看法和负面看法。例如,对于管理员的情况下,我已经试过这

(?<!Administrator)\s+yes 

但是,仍然是具有管理员行了比赛,我怀疑是因为\ S +的。非常感谢,谢谢。

+0

怎么样区分大小写? 'userb yes'应该匹配还是不匹配?请将这些示例分为两类(匹配/不匹配) – Aprillion

+1

您使用的是哪种编程语言?你确定你需要这里的正则表达式吗?你不能只是分割空白行,并检查用户名字段包含什么? – SilentGhost

回答

2

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

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

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

在多模式^将匹配在开始每一行。

更新:事实上,在写完这些之后,我确实想出了一个使用逆序的解决方案。只需确保,你一堆字,字符后立即执行的回顾后:

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

现在\s+必须匹配所有的空间,否则不会通过文字字符开头。

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

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