一千萬個為什麽

搜索

匹配分隔文本,考慮到級別

我正在尋找一種替代方法

\cmd1{stuff \cmd2{other stuff}}

(stuff \cmd2{other stuff})

我努力了

:%s/\\cmd1{\(.\{-}\)}/(\1)/gc

但是,這會返回

(stuff \cmd2{other stuff)}

因為 {因為 \ { - } 而取得第一個} - 貪婪的版本沒有幫助,在那裏是後來的另一個}

是否有更好的表達式放在 {\(\)} 中,以便 \(\)包含匹配} 之前的所有內容代碼> {</代碼>?

最佳答案

正則表達式

如果需要能夠支持任意級別的嵌套,(如果 \ cmd2 中沒有 \ cmd3 ),然後你可以通過將內部括號合並到表達式中,並匹配“任何不是括號的字符” [^}] 而不是“任何字符”

:%s/\\cmd1{\([^{]*{[^}]*}\)}/(\1)/gc

宏觀替代

否則,您可以使用宏代替:

您正在使用 c confirm標誌檢查每個更改,因此請嘗試以下操作:

  1. /\\cmd1{: Find the first \cmd1
  2. qq: Start recording
  3. dt{: delete the \cmd1
  4. %: Jump to matching }
  5. r)``r(: Replace curly brackets with round ones
  6. n: Jump to next match
  7. q: Stop recording

然後按 @q 重復更改,或按 n 跳過此實例並跳轉到下一個。在使用 @q 至少一次之後,可以使用 @@ 作為更快的快捷方式。

If you actually don't want to review the changes as you make them, you can make the macro recursive by changing the recording steps 2–7 to:

qqqqqdt{%r)``r([email protected]

You can then invoke it a single time to make all the changes in one go: @q

轉載註明原文: 匹配分隔文本,考慮到級別