私は Notepad++ を使い始めたばかりで、正規表現を使用してフィールド内の特定の値を検索し、その親タグ (およびフィールドを含むすべてのコンテンツ) を削除しようとしています。
基本的に、特定のストア ID を持つトランザクションを削除しようとしています。ファイルは膨大で、削除する必要があるエントリが何千もあります。以下にサンプルを示します。
サンプル
<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>
希望
<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>
上記の目的のテキストは、8351を含むトランザクションタグを完全に削除しました。
次のクエリを使用して、正規表現の検索と置換 (何も指定しない) を試しました。
<Transaction>.*?<StoreID>8351</StoreID>.*?</Transaction>
そして、文書の上から8351を含む最初のトランザクションの最後まで、文書の大きな部分をラップすることになった。
ご協力いただければ幸いです。
答え1
- Ctrl+H
- 検索対象:
<Transaction>(?:(?!</Transaction>).)+<StoreId>8351</StoreId>(?:(?!<Transaction>).)+</Transaction>\R
- と置換する:
LEAVE EMPTY
- チェック大文字と小文字を一致させる
- チェック ラップアラウンド
- 正規表現をチェック
- チェック
. matches newline
- Replace all
説明:
<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
画面キャプチャ:
詳細はこちら強化された貪欲トークン