regex - 排除某些模式?

标签 regex

我有以下模式

Administrator        yes
User                 yes
Userb                yes
userc                yes
userd                yes

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

我已经尝试过负面前瞻和负面回顾。例如对于管理员的情况,我试过这个

(?<!Administrator)\s+yes

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

最佳答案

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

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

^(?!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

关于regex - 排除某些模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13052984/

相关文章:

javascript - 我怎样才能使 npm Jest 脚本跨平台而不显得疯狂?

Python 在工作正则表达式上不返回任何匹配项

java - 正则表达式匹配三个前导和结束单引号

正则表达式可以单独工作,但在 strsplit 中一起使用时则不起作用

python - 如何匹配此模式和字符串中的最后一个空格?

c++ - boost中的正则表达式提取信息

VBScript 中的 Regex Positive Lookbehind 替代方案

Python搜索字符模式,如果存在则缩进

regex - 如何使用 golang 正则表达式引用组

java - 通过正则表达式删除维基文本超链接