2014-01-28 109 views
0

我有一個header字符串在我想用expected_status替換的文件中。 header顯示爲headersheader:。我只是想,以取代那些與預期狀態結腸,所以:header: --> expected_status:Emacs正則表達式替換組

我使用replace-regexp用下面的命令:

Replace string (default \(header\):?$ -> expected_status):

但是,它不替換正常。它正在用expected_status取代冒號。有沒有辦法讓emacs只對已識別的正則表達式組進行替換?

回答

2

有沒有辦法讓emacs只對已識別的正則表達式組進行替換?

當然;但不能與replace-regexp

(while (re-search-forward "\\(header\\):" nil t) 
    (replace-match "expected_status" nil nil nil 1)) 

1末是SUBEXP參數replace-match,指定組/子表達式來從匹配正則表達式替換。

因此,舉例來說:

(defun my-replace-regexp-group (from to group) 
    "In all matches for regexp FROM, replace the content of GROUP with TO." 
    (interactive "sFrom: \nsTo: \nnGroup: ") 
    (while (re-search-forward from nil t) 
    (replace-match to nil nil nil group))) 
0

不 - 但您可以做什麼標記您想保留的部分,然後將其包含在替換表達式中。不確定你試圖匹配的確切正則表達式 - 但看起來像是帶有可選「:」的「標題」,並將其替換爲「expected_status」。

爲了保持可選 「:」 替換 「頭(?)$」 與 「\ 1:expected_status」

+0

你的意思是, 「(頭):$」 與' 「\ 1expected_status」'? 你爲什麼將冒號分組?你是否將你不想替換的部分分組?將你想要替換的那個分組是有意義的。 – darksky

+0

分組只是允許在其他地方再次使用該表達的部分。與正則表達式匹配的整個字符串將被替換 - 但如果您標記了要保留的部分,則可以將其放回替換部分。 – Beano

1

那豈不是更容易忘掉組,做的Mx替代,正則表達式RET頭:RET expected_status:RET

或者我錯過了你想要達到的目標。

並回答在一個通用的方式你的問題:

僅更換一個正則表達式組您可以創建三個組:

\(the-stuff-before\)\(the-stuff-you-want-to_replace\)\(the-stuff-after\) 

然後你替換由

\1the-stuff-you-want\3 
+0

是的,但問題是'header'有':?'。所以我仍然希望它能夠不用冒號來代替'header',而不用'headers'。 – darksky

+0

如果前後都可以是隨意的?這似乎使正則表達式複雜化。沒有辦法選擇一個組並取代它嗎? – darksky

+0

如果之前和之後是任意的,你只需要替換stuffA bu stuffB。這是微不足道的。在你的情況下,「before」不存在,「after」是正則表達式「:?$」。你可以用expected_status \ 1替換header \(:?\)$ – juanleon