簡體   English   中英

如何在vim中非捕獲搜索和替換

[英]how to non-capturing search and replace in vim

我正在嘗試學習如何使用vim的正則表達式,我正在嘗試進行搜索和替換。 我有這樣的事情:

aaaaaaa&sometext&...
aaaaaaaanothertext

a s實際上是行開頭的空格,我不知道如何在這里打印)

我想用& &替換&的第一次出現,並保持其他所有的原樣。 我正在使用\\%(...\\)作為非捕獲模式,如此處所示 ,但仍然捕獲了a模式。 我正在使用:%s/\\%(^a*\\)&/& &/gc ,我得到:

aaaaaaaa& aaaaaaaa&sometext&...
aaaaaaaaanothertext

我不明白為什么。 我也嘗試過用組替換,如:%s/\\%(^a*\\)\\(&\\)/\\1 \\1/gc ,但后來我得到:

& &sometext&...
aaaaaaaanothertext

因此,似乎該組實際上被忽略了組處理(因為第一組在搜索模式上是& ),但仍然在搜索模式上捕獲。

所以,長話短說,取代命令我必須使用來自:

aaaaaaa&sometext&...

至:

aaaaaaa& &sometext&...

我想替換的第一次出現&& & ,並保留一切按原樣

使用替換命令:

:s/&/& &/

另一個提示:Vim默認處理(作為文字字符,而不是組的開頭)。

如果您希望正則表達式更像傳統(Perl)正則表達式,請使用very magic模式。

指定very magic模式的簡單方法是使用\\v啟動正則表達式:

" this is a no-op
:s/\v(this is grouped)/\1/

編輯:這個答案有效,但請參閱下面的@ heijp06非常相關的評論(我不知道&字符有特殊含義)。

評論貼在這里:

實際上這個答案是正確的,這實際上有點不重要。 替換的替換部分中的&替換意味着在這種情況下與模式匹配的那樣的結果是正確的。

“非捕獲”並不意味着您認為它意味着什么。 \\(...\\)\\%(...\\)之間的唯一區別在於子表達式是否保存到\\1\\2 ......它仍將包含匹配中匹配的內容。

你想要\\@<=:help \\@<= ):

:s/\(^a*\)\@<=&/\& \&/g

通常在搜索和替換中,替換完全替換搜索就足夠了。 在這種情況下,您的搜索將包含您不想替換的內容。

Vim有一些有用的模式來定義匹配的開始和結束: \\zs\\ze 您可以將\\zs放在搜索的任何位置,vim只會在開始后匹配。 您可以使用兩者來表示,找到此特定行並僅替換其中的一部分。

而解決方案:

:%s:^[^&]*\\zs&:& &:c

  • %s :查看文件中的每一行
  • ^[^&]* :從行的開頭,應該有零個或多個 &
  • \\zs& :要替換的比賽是一個&
  • & & :用兩個替換匹配&
  • c :以交互方式執行每個替換,以防我在正則表達式中吮吸

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM