Notepad ++ und XML - Ersetzen <div class="body"> <p>Ich habe eine XML-Datei (1000er Datensätze, hier vereinfacht), Struktur (zB sagen Sie):</p> <pre><code>&lt;LIST&gt; &lt;ITEM_0&gt; &lt;NAME&gt;Item Name&lt;/NAME&gt; &lt;/ITEM_0&gt; ... &lt;ITEM_9999&gt; &lt;NAME&gt;Item Name&lt;/NAME&gt; &lt;/ITEM_9999&gt; &lt;/LIST&gt; </code></pre> <p>Ich brauche das Ergebnis:</p> <pre><code>&lt;LIST&gt; &lt;ITEM&gt; &lt;ID&gt;0&lt;/ID&gt; &lt;NAME&gt;Item Name&lt;/NAME&gt; &lt;/ITEM&gt; ... &lt;ITEM&gt; &lt;ID&gt;9999&lt;/ID&gt; &lt;NAME&gt;Item Name&lt;/NAME&gt; &lt;/ITEM&gt; &lt;/LIST&gt; </code></pre> <p>Verwendung von Regex:</p> <pre><code>Find: \&lt;ITEM_(.*)(&gt;) Replace: ITEM&gt;\n&lt;ID&gt;\1\&lt;/ID&gt; </code></pre> <p>Ich bekomme:</p> <pre><code>&lt;LIST&gt; &lt;ITEM&gt; &lt;ID&gt;0&lt;/ID&gt; &lt;NAME&gt;Item Name&lt;/NAME&gt; &lt;/ITEM&gt; &lt;ID&gt;0&lt;/ID&gt; &lt;-- This line not wanted ... &lt;ITEM&gt; &lt;ID&gt;9999&lt;/ID&gt; &lt;NAME&gt;Item Name&lt;/NAME&gt; &lt;/ITEM&gt; &lt;ID&gt;9999&lt;/ID&gt; &lt;-- This line not wanted &lt;/LIST&gt; </code></pre> <p>Es ersetzt <code>&lt;/ITEM&gt;</code> <strong>auch</strong>, obwohl (ich denke) ich nur darum ersuche <code>&lt;ITEM&gt;</code>- was mache ich falsch / wie zu beheben? Ich kann etwas in Bezug auf Gruppierung (oder "gierig"?) Vermissen, aber ich bin mir nicht sicher, was und habe überall nach Ähnlichem gesucht. Es gibt eine Million Möglichkeiten, um es mit etwas anderem zu schneiden und zu würfeln, aber es nervt mich einfach, so nahe zu kommen, aber nicht mit NPP.</p> <p>Hilfe danke danke.</p> <p><strong>Late Edit:</strong> Auch wenn ich das erste Ersetzen richtig <code>&lt;ITEM_#&gt;</code>mache, nur das Tag. Ich habe immer noch das <code>&lt;/ITEM_#&gt;</code>schließende Tag als weitere Such- / Ersetzungsoperation. Das Problem hierbei ist, dass die aktuelle Operation <strong>sowohl</strong> die <code>&lt;ITEM</code>als auch die <code>&lt;/ITEM</code>Tags ersetzt ...</p> </div>

1890
Catch21

Ich habe eine XML-Datei (1000er Datensätze, hier vereinfacht), Struktur (zB sagen Sie):

<LIST> <ITEM_0> <NAME>Item Name</NAME> </ITEM_0> ... <ITEM_9999> <NAME>Item Name</NAME> </ITEM_9999> </LIST> 

Ich brauche das Ergebnis:

<LIST> <ITEM> <ID>0</ID> <NAME>Item Name</NAME> </ITEM> ... <ITEM> <ID>9999</ID> <NAME>Item Name</NAME> </ITEM> </LIST> 

Verwendung von Regex:

Find: \<ITEM_(.*)(>) Replace: ITEM>\n<ID>\1\</ID> 

Ich bekomme:

<LIST> <ITEM> <ID>0</ID> <NAME>Item Name</NAME> </ITEM> <ID>0</ID> <-- This line not wanted ... <ITEM> <ID>9999</ID> <NAME>Item Name</NAME> </ITEM> <ID>9999</ID> <-- This line not wanted </LIST> 

Es ersetzt </ITEM> auch, obwohl (ich denke) ich nur darum ersuche <ITEM>- was mache ich falsch / wie zu beheben? Ich kann etwas in Bezug auf Gruppierung (oder "gierig"?) Vermissen, aber ich bin mir nicht sicher, was und habe überall nach Ähnlichem gesucht. Es gibt eine Million Möglichkeiten, um es mit etwas anderem zu schneiden und zu würfeln, aber es nervt mich einfach, so nahe zu kommen, aber nicht mit NPP.

Hilfe danke danke.

Late Edit: Auch wenn ich das erste Ersetzen richtig <ITEM_#>mache, nur das Tag. Ich habe immer noch das </ITEM_#>schließende Tag als weitere Such- / Ersetzungsoperation. Das Problem hierbei ist, dass die aktuelle Operation sowohl die <ITEMals auch die </ITEMTags ersetzt ...

0
Warum nicht regelmäßig ersetzen und `ersetzen Blerg vor 7 Jahren 0
Ja, danke, würde funktionieren, aber 2 ersetzen, wohingegen x2 in 1 Regex-Lösung unten suchen / ersetzen funktioniert OK (aber mit dem Q dort immer noch hervorragend). Catch21 vor 7 Jahren 0

2 Antworten auf die Frage

0
grawity

Ja, es ist wahrscheinlich, dass das .*zu "gierig" ist und so viele Charaktere wie möglich erfasst. Sie brauchen das Gegenteil - stattdessen das kürzeste Spiel.

Eine Methode wäre stattdessen zu verwenden [^>]*- dies würde immer noch so viele wie möglich passen, aber nur bis zum ersten >, also <ITEM_([^>]*)>nur das öffnende Tag und nichts mehr.

Abhängig von der Regex-Syntax kann dies .*?auch funktionieren - dies schaltet explizit *auf "nicht gierig".

0
Catch21

Dank der Großzügigkeit hat es mir geholfen, meine Suche hier zu erweitern, um mehrere Suchen und Ersetzen in einer Regex abzudecken.

Versuchen Sie die folgenden Arbeiten:

Find: </ITEM_.*(>)|<ITEM_(.*)(>) Replace: (?1</ITEM>)(?2<ITEM>\n<ID>\2</ID>) RegEx 

Die | trennt 2 gesuchte Saiten und die Zeichen 1 und 2 sind ihre jeweiligen Ersetzungen.

Aber ich muss zuerst nach dem schließenden </ITEMTag suchen, nicht nach dem <ITEMTag, wie Sie es logisch finden würden. Ich habe also eine Lösung, aber kann irgendjemand die Frage beantworten, warum das Obige funktioniert, aber das Folgende, zuerst nach einem <ITEMTag suchend, fehlschlägt, wenn wir nur die Reihenfolge umkehren, in der wir suchen?

Find: <ITEM_(.*)(>)|</ITEM_.*(>) Replace: (?1<ITEM>\n<ID>\1</ID>)(?2</ITEM> RegEx 

Nicht wesentlich, aber ein interessierendes Kennenlernen möchte es vielleicht wissen. Vielen Dank.