使用vim,我想下面兩行vim的正則表達式匹配用方括號不工作
output reg [1:0] abcd,
output reg efgh,
轉換成
abcd
efgh
我使用正則表達式,
:%s/\voutput|reg|\s*|\[.*\]|,//g
但是,我得到的輸出爲,
[1:0]abcd,
efgh,
感謝任何幫助!謝謝。
使用vim,我想下面兩行vim的正則表達式匹配用方括號不工作
output reg [1:0] abcd,
output reg efgh,
轉換成
abcd
efgh
我使用正則表達式,
:%s/\voutput|reg|\s*|\[.*\]|,//g
但是,我得到的輸出爲,
[1:0]abcd,
efgh,
感謝任何幫助!謝謝。
: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稱之爲「模式」有關... sed
和perl
是最左的:
$ 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
小號gensub
和nvi
小號extended
引擎也顯然最左邊,最長)
$xbd0
將做的工作在一行。你可以錄製一個宏來自動完成多行。
這工作(尋找接近尾聲4字母順序):
%s/^.*\<\(\a\{4}\),\s*$/\1/g
在你的正則表達式的問題是,你問\ S的部分*。這意味着在腸道「沒有或很多空白」。由於整個正則表達式是一個大OR,那麼Vim將開始消費你的字符串,直到它找到至少一個空格。發生這種情況時,它會再次從OR的開始處開始匹配並重復該過程。因此,這意味着您在\ s *後試圖接收的任何表達式都將被忽略,因爲\ s *可以儘可能多地使用它,直到找到空字符。要驗證這一點,請注意,如果您更改\ s *的位置,您將得到不同的結果,這隻會消除\ s *之前的表達式。
我相信你真的想要的正則表達式是:
:%s/\voutput|reg|\s+|\[.*\]|,//g
爲了表明要替換的地方至少有一個空格。這對我來說工作得很好。
您的正則表達式無法正常工作的原因。
看來vim從左到右讀取正則表達式,並嘗試按順序匹配工會的每個部分。
所以output|reg|\s*|\[.*\]|,
\[.*\]
永遠不會到達,因爲空字符串匹配\s*
這是每個字符之間。由於vim正則表達式引擎匹配的東西,它立即做替換。
如果你只是重新排序工會\s*
是最後的正則表達式如預期工作。
所以命令應該是:%s/\voutput|reg|\[.*\]|,|\s*//g
奇怪的結果。試試'/.*(\ w +),/ $ 1/g'(或者你可以參考vim中的捕獲組)。 – Qtax
我保持這個問題是開放的,因爲我想了解爲什麼在問題中提到的正則表達式不起作用。 – Rakesh
你可以將你的正則表達式('\ voutput | reg | \ s * | \ [。* \] |,')插入到像http://www.regexper.com/這樣的網站中來可視化它。 – ajp15243