2017-06-27 3 views
0

Ich versuche, die folgende Vim regulären Ausdruck zu verwenden:Warum stimmt diese Vim RegEx Suche und Ersetzung nicht überein?

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

ich auch versucht habe:

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

Die Saite, die ich gegen passende bin die Form (von vielen Linien) dieser :

<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> 
    ... 
    ... 
    ... 

ich nur den Teil, der so aussieht einzufangen und entfernen versuchen:

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

Wenn ich den regulären Ausdrücken Syntax in etwas umwandeln, die PCRE nimmt, fängt es, was ich richtig brauchen:

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

Was bin ich hier?

Edit: Ich bin dumm, mein erster Versuch funktioniert, aber ich hatte es nicht in Vim behoben, nachdem es anderswo behoben wurde.

Aber - ich bin immer noch neugierig, warum die andere Form der Magie \v funktioniert nicht:

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

Antwort

1

\s ist Charakterklasse it-Selbst. Sie können \s oder \w nicht in [] verwenden. Wenn Sie es verwenden möchten, müssen Sie stattdessen [[:space:]] verwenden. [\s] passen nur \ und s.

Und Sie können \_ Modifizierer für .{-} verwenden. Dies kann das Zeilenende beinhalten.

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

Ich würde keinen Ersatz verwenden.

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

See:

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

Ich schätze die Hilfe, aber ich glaube nicht, dass dies eine Antwort ist. Ich könnte das als Kommentar verwenden. Meine Frage lautet konkret: "Warum funktioniert diese Regex nicht?" Trotzdem danke! –

Verwandte Themen