2013-06-04 83 views
2

使用vim,我想下面兩行vim的正則表達式匹配用方括號不工作

output reg [1:0] abcd, 
    output reg efgh, 

轉換成

abcd 
efgh 

我使用正則表達式,

:%s/\voutput|reg|\s*|\[.*\]|,//g 

但是,我得到的輸出爲,

[1:0]abcd, 
efgh, 

感謝任何幫助!謝謝。

+0

奇怪的結果。試試'/.*(\ w +),/ $ 1/g'(或者你可以參考vim中的捕獲組)。 – Qtax

+0

我保持這個問題是開放的,因爲我想了解爲什麼在問題中提到的正則表達式不起作用。 – Rakesh

+0

你可以將你的正則表達式('\ voutput | reg | \ s * | \ [。* \] |,')插入到像http://www.regexper.com/這樣的網站中來可視化它。 – ajp15243

回答

3

:help pattern給出的理由(雖然有幫助,很多,已經從之前曝光的原因猜測的不同的可能性:-)

1. A pattern is one or more branches, separated by "\|". It matches anything that matches one of the branches. Example: "foo\|beep" matches "foo" and matches "beep".If more than one branch matches, the first one is used.

Vim的正則表達式匹配器是第一個匹配的引擎。 POSIX授權最長。純粹主義者可能會爭辯說,其他任何東西都不是正則表達式匹配器,而只是一個「模式匹配器」,它可能與vim稱之爲「模式」有關... sedperl是最左的:

$ sed -r 's/output|reg|\s*|\[.*\]|,//g' @@ 
abcd 
efgh 
$ perl -ple 's/output|reg|\s*|\[.*\]|,//g' @@ 
abcd 
efgh 

但你必須做不同的事情有點首次匹配引擎。重新排列你的替代品,它的工作原理:

:%s/\voutput|reg|\[.*\]|,|\s*//g 

和更換\s*\s+使其不受命令:

:%s/\voutput|reg|\s+|\[.*\]|,//g 

Vim的g標誌似乎只替換第一個匹配的分支的每一次出現,然後重試,直到沒有改變。

只要是完整的,混亂的,

:%s/\v(reg|output|\s*|\[.*\]|,)*// 
abcd, 
efgh, 

:%s/\v(reg|output|\s*|\[.*\]|,)*//g 
abcd 
efgh 

根據上面推導出的規則,對於我來說,短暫的一段時間實際上對我有意義。

(編輯:gawk小號gensubnvi小號extended引擎也顯然最左邊,最長)

3

試試這個

\v\[.*]\s+|output\s+|reg\s+ 
+0

謝謝,我試了下面,它的工作原理。但是,我仍然不明白爲什麼在我的問題中使用的正則表達式不起作用。 %s/\ v \ [。* \] \ s * | output | reg |,| \ s * // g – Rakesh

+0

因爲您有空間]我想你有一個預先的]斜槓 – i100

3
$xbd0 

將做的工作在一行。你可以錄製一個宏來自動完成多行。

0

這工作(尋找接近尾聲4字母順序):

%s/^.*\<\(\a\{4}\),\s*$/\1/g 
1

在你的正則表達式的問題是,你問\ S的部分*。這意味着在腸道「沒有或很多空白」。由於整個正則表達式是一個大OR,那麼Vim將開始消費你的字符串,直到它找到至少一個空格。發生這種情況時,它會再次從OR的開始處開始匹配並重復該過程。因此,這意味着您在\ s *後試圖接收的任何表達式都將被忽略,因爲\ s *可以儘可能多地使用它,直到找到空字符。要驗證這一點,請注意,如果您更改\ s *的位置,您將得到不同的結果,這隻會消除\ s *之前的表達式。

我相信你真的想要的正則表達式是:

:%s/\voutput|reg|\s+|\[.*\]|,//g 

爲了表明要替換的地方至少有一個空格。這對我來說工作得很好。

1

您的正則表達式無法正常工作的原因。

看來vim從左到右讀取正則表達式,並嘗試按順序匹配工會的每個部分。

所以output|reg|\s*|\[.*\]|,\[.*\]永遠不會到達,因爲空字符串匹配\s*這是每個字符之間。由於vim正則表達式引擎匹配的東西,它立即做替換。

如果你只是重新排序工會\s*是最後的正則表達式如預期工作。

所以命令應該是:%s/\voutput|reg|\[.*\]|,|\s*//g