2017-06-27 57 views
0

我嘗試使用下面的Vim的正則表達式:這爲什麼Vim RegEx搜索和替換不匹配?

%s/\v(\<Column\>[\s\w\<\>\/]+\<Name\>\s*Code\s*\<\/Name\>([\s\w\<\>\/]){-}\<\/Column\>)//g 

我對匹配的字符串的格式(多行):

%s/\(<Column>[\ \t\nA-Za-z0-9\<\>\/]\+<Name>[ \t\n]*Code[ \t\n]*<\/Name>\([\ \t\nA-Za-z0-9\<\>\/]\)\{-}<\/Column>\)//g 

我也試圖:

<Table> 
    <Name>NameOfThing</Name> 
    <Description>Description of thing</Description> 
    <Type>Data</Type> 
    <Columns> 
    <Column> 
     <Name>Code</Name> 
     <Description>Things Code</Description> 
     <Type>String</Type> 
     <Length>254</Length> 
    </Column> 
    <Column> 
     <Name>TypeCode</Name> 
     <Description>Things type code</Description> 
     <Type>String</Type> 
     <Length>254</Length> 
    </Column> 
    <Column> 
     <Name>Name</Name> 
     <Description>Things Name</Description> 
     <Type>String</Type> 
     <Length>254</Length> 
    </Column> 
    ... 
    ... 
    ... 

我試圖捕獲和移除只是看起來像這樣的部分:

<Column> 
     <Name>Code</Name> 
     <Description>Things Code</Description> 
     <Type>String</Type> 
     <Length>254</Length> 
    </Column> 

當我轉換正則表達式模式語法到的東西,PCRE接受,它抓住了我所需要的正確:

(<Column>[\s\w\<\>\/]+<Name>[ \t\n]*Code[ \t\n]*<\/Name>[\s\w\<\>\/]+?<\/Column>) 

缺少什麼我在這裏?


編輯:我很愚蠢,我的第一個嘗試工作,但我沒有修復它在其他地方固定它之後的Vim。

不過 - 我仍然好奇,爲什麼其他形式與魔法\v不起作用:

%s/\v(\<Column\>[ \t\nA-Za-z0-9\<\>\/]+\<Name\>[ \t\n]*Code[ \t\n]*\<\/Name\>[ \t\n\<\>\/]{-}\<\/Column\>)//g 

回答

1

\s是字符類是自我。您不能在[]中使用\s\w。如果你想使用它,你必須改用[[:space:]][\s]只匹配\s

而且您可以使用\_修飾符.{-}。這可以包括行尾。

%s/\v(\<Column\>\_.{-}\<Name\>\s*Code\s*\<\/Name\>\_.{-}\<\/Column\>)//g 
0

我不會用一個替代。

:g/>Code</-1,+4d 

參見:

:help :g 
:help :range 
:help :d 
+0

我欣賞的幫助,但我不相信這是一個答案。我可以用它作爲評論。我的問題具體是:「爲什麼這個正則表達式不起作用?」不過謝謝你! –