为什么这个Vim RegEx搜索和替换不匹配?

时间:2017-06-27 17:38:25

标签: regex vim

我正在尝试使用以下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 

2 个答案:

答案 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