我正在尝试使用以下Vim RegEx模式:
%s/\(<Column>[\ \t\nA-Za-z0-9\<\>\/]\+<Name>[ \t\n]*Code[ \t\n]*<\/Name>\([\ \t\nA-Za-z0-9\<\>\/]\)\{-}<\/Column>\)//g
我也尝试过:
%s/\v(\<Column\>[\s\w\<\>\/]+\<Name\>\s*Code\s*\<\/Name\>([\s\w\<\>\/]){-}\<\/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
答案 0 :(得分:1)
\s
是字符类it-self。您无法在\s
中使用\w
或[]
。如果要使用它,则必须使用[[:space:]]
。 [\s]
仅匹配\
和s
。
您可以对\_
使用.{-}
修饰符。这可以包括行尾。
%s/\v(\<Column\>\_.{-}\<Name\>\s*Code\s*\<\/Name\>\_.{-}\<\/Column\>)//g
答案 1 :(得分:0)
我不会使用替代品。
:g/>Code</-1,+4d
请参阅:
:help :g
:help :range
:help :d