3

我有以下模式

Administrator        yes
User                 yes
Userb                yes
userc                yes
userd                yes

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

我尝试过消极的前瞻和消极的后瞻。例如对于管理员的情况,我试过这个

(?<!Administrator)\s+yes

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

4

2 回答 2

2

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

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

^(?!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
于 2012-10-24T16:02:33.040 回答
0

这有效:

^(?!Administrator|User).*yes   

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

于 2012-10-24T16:08:31.330 回答