Ich bin ziemlich neu bei Notepad++ und versuche, mit Regex nach bestimmten Werten in einem Feld zu suchen und dessen übergeordnetes Tag (und den gesamten Inhalt einschließlich des Felds) zu löschen.
Im Wesentlichen versuche ich, Transaktionen zu entfernen, die bestimmte Store-IDs haben. Die Dateien sind riesig und es gibt Tausende von Einträgen, die ich löschen muss, Beispiel unten!
Probe
<Transaction>
<TxnHeader>
<StoreId>6705</StoreId>
<TillNumber>1</TillNumber>
<TxnNumber>343243</TxnNumber>
<StartDate>2019-02-02T07:42:45</StartDate>
<TxnType>1</TxnType>
</TxnHeader>
<TxnItemLines>
<TxnItemLine>
<DetailSequence>1</DetailSequence>
<ItemNumber>6304</ItemNumber>
<DeptNumber>168</DeptNumber>
<Quantity>1.000000</Quantity>
<LineValue>4.470000</LineValue>
</TxnItemLine>
</TxnItemLines>
</Transaction>
<Transaction>
<TxnHeader>
<StoreId>8351</StoreId>
<TillNumber>1</TillNumber>
<TxnNumber>327527</TxnNumber>
<StartDate>2019-02-02T08:02:47</StartDate>
<TxnType>1</TxnType>
</TxnHeader>
<TxnItemLines>
<TxnItemLine>
<DetailSequence>1</DetailSequence>
<ItemNumber>6304</ItemNumber>
<DeptNumber>168</DeptNumber>
<Quantity>1.000000</Quantity>
<LineValue>7.310000</LineValue>
</TxnItemLine>
</TxnItemLines>
</Transaction>
<Transaction>
<TxnHeader>
<StoreId>7837</StoreId>
<TillNumber>1</TillNumber>
<TxnNumber>164728</TxnNumber>
<StartDate>2019-02-02T08:19:47</StartDate>
<TxnType>1</TxnType>
</TxnHeader>
<TxnItemLines>
<TxnItemLine>
<DetailSequence>1</DetailSequence>
<ItemNumber>1902</ItemNumber>
<DeptNumber>154</DeptNumber>
<Quantity>1.000000</Quantity>
<LineValue>10.000000</LineValue>
</TxnItemLine>
</TxnItemLines>
</Transaction>
Gewünscht
<Transaction>
<TxnHeader>
<StoreId>6705</StoreId>
<TillNumber>1</TillNumber>
<TxnNumber>343243</TxnNumber>
<StartDate>2019-02-02T07:42:45</StartDate>
<TxnType>1</TxnType>
</TxnHeader>
<TxnItemLines>
<TxnItemLine>
<DetailSequence>1</DetailSequence>
<ItemNumber>6304</ItemNumber>
<DeptNumber>168</DeptNumber>
<Quantity>1.000000</Quantity>
<LineValue>4.470000</LineValue>
</TxnItemLine>
</TxnItemLines>
</Transaction>
<Transaction>
<TxnHeader>
<StoreId>7837</StoreId>
<TillNumber>1</TillNumber>
<TxnNumber>164728</TxnNumber>
<StartDate>2019-02-02T08:19:47</StartDate>
<TxnType>1</TxnType>
</TxnHeader>
<TxnItemLines>
<TxnItemLine>
<DetailSequence>1</DetailSequence>
<ItemNumber>1902</ItemNumber>
<DeptNumber>154</DeptNumber>
<Quantity>1.000000</Quantity>
<LineValue>10.000000</LineValue>
</TxnItemLine>
</TxnItemLines>
</Transaction>
Der gewünschte Text oben hat den Transaktionstag, der 8351 enthält, vollständig entfernt
Ich habe eine Regex-Suche und -Ersetzung (mit nichts) mithilfe der folgenden Abfrage versucht:
<Transaction>.*?<StoreID>8351</StoreID>.*?</Transaction>
und es endete damit, dass ein riesiger Teil des Dokuments vom Anfang bis zum Ende der ersten Transaktion mit 8351 umschlossen wurde.
Jede Hilfe wäre sehr willkommen!
Antwort1
- Ctrl+H
- Finde was:
<Transaction>(?:(?!</Transaction>).)+<StoreId>8351</StoreId>(?:(?!<Transaction>).)+</Transaction>\R
- Ersetzen mit:
LEAVE EMPTY
- check Groß-/Kleinschreibung beachten
- check Umwickeln
- check Regulärer Ausdruck
- ÜBERPRÜFEN
. matches newline
- Replace all
Erläuterung:
<Transaction> # opening tag
(?:(?!</Transaction>).)+ # tempered greedy token, make sure we haven't </Transaction> before the following
<StoreId>8351</StoreId> # literally
(?:(?!<Transaction>).)+ # tempered greedy token, make sure we haven't <Transaction> before the following
</Transaction> # literally, closing tag
\R? # optional any kind of linebreak
Bildschirmaufnahme:
Mehr überGemäßigtes Gier-Token