Regular-Expression

如何使用正則表達式負前瞻?

  • January 19, 2022

如果我離開我的主目錄,我正在嘗試在我的 mac 上使用 iTerm2 配置文件觸發器來更改提示。只有當我所在的節點的主機名為headnode. 提示還將在主機名後面的括號中包含機器的位置。我正在嘗試建構一個匹配任何目錄的正則表達式,除非它包含~.

所以它應該匹配:

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

但不是:

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

目前我正在像這樣建構我的正則表達式:

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

但這與上面的所有範例都匹配。有誰知道我做錯了什麼?謝謝!

\[.*\@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+ (?!\~).*\]

引用自:https://unix.stackexchange.com/questions/385003