![如何使用正则表达式负向前瞻?](https://linux22.com/image/115813/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E8%B4%9F%E5%90%91%E5%89%8D%E7%9E%BB%EF%BC%9F.png)
我正在尝试在我的 mac 上使用 iTerm2 配置文件触发器来更改离开主目录时的提示。此规则仅适用于我所在的节点的主机名为 的情况headnode
。该提示还将在主机名后面的括号中包含计算机的位置。我正在尝试构建一个将匹配任何目录的正则表达式,除非它包含~
.
所以它应该匹配:
[jbutryn@headnode (us-west-a) /]$
但不是:
[jbutryn@headnode (us-west-a) ~]$
or
[jbutryn@headnode (us-west-a) ~/tmp]$
etc.
目前我正在像这样构建我的正则表达式:
\[.*\@headnode.*(?!\~).*].
但这与上面的所有示例相匹配。有谁知道我做错了什么?谢谢!
答案1
\[.*\@headnode.*(?!\~).*\]
比赛日期
[
其次是.*
:由 0 个或多个字符组成的序列,后跟@headnode
其次是.*
:由 0 个或多个字符组成的序列,后面不跟~
, 其次是.*
:由 0 个或多个字符组成的序列,后跟:]
它确实匹配:
[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 中的正则表达式部分替换为:
[^~]*