如何使用正则表达式负向前瞻?

如何使用正则表达式负向前瞻?

我正在尝试在我的 mac 上使用 iTerm2 配置文件触发器来更改离开主目录时的提示。此规则仅适用于我所在的节点的主机名为 的情况headnode。该提示还将在主机名后面的括号中包含计算机的位置。我正在尝试构建一个将匹配任何目录的正则表达式,除非它包含~.

所以它应该匹配:

[jbutryn@headnode (us-west-a) /]$

但不是:

[jbutryn@headnode (us-west-a) ~]$
or
[jbutryn@headnode (us-west-a) ~/tmp]$
etc.

目前我正在像这样构建我的正则表达式:

\[.*\@headnode.*(?!\~).*].

但这与上面的所有示例相匹配。有谁知道我做错了什么?谢谢!

答案1

\[.*\@headnode.*(?!\~).*\]

比赛日期

  1. [其次是
  2. .*:由 0 个或多个字符组成的序列,后跟
  3. @headnode其次是
  4. .*:由 0 个或多个字符组成的序列,后面不跟
  5. ~, 其次是
  6. .*:由 0 个或多个字符组成的序列,后跟:
  7. ]

它确实匹配:

[jbutryn@headnode (us-west-a) ~/tmp]$

因为那是:

<[><jbutryn><@headnode>< (us-west-a) ~/tmp><><]>$
 1  2        3          4                  6  7

接下来的4不是~

您需要将否定前瞻置于与文本中特定内容相匹配的位置,例如在 after 的第一个单词之后@headnode

\[.*\@headnode \S+ (?!\~).*\]

答案2

下班斯特凡的崩溃,我建议一个稍微不同的解决方案。由于停止在第 4 项中包含内容的信号只有一个字符宽,因此很容易构造一个包含除信号字符之外的所有字符的类,或者在本例中为单个字符。

换句话说,将 #4 中的正则表达式部分替换为:

[^~]* 

相关内容