2

ここで、それらを組み合わせると役立つ可能性のあるいくつかの回答を見ましたが、適切に行う方法がわかりません。

次のテキスト ファイルがあるとします。

aaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaa
[a]
aaaaaaaaaaaaaaaaaaaaaaaaaaaaa[h]
aaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

[a]
aaaaaaaaaaaaaaaaaaaaaaaa[h]
aaaaaaaaaaaaaaaaaaaaaaaaaaa

どこ:

  • 「a」は、特殊記号、Unicode 文字などを含む、文字通り任意の文字 (または文字のセット) を意味します。
  • "h" は固定ラテン文字です
  • 括弧は括弧を意味します
  • 空白行は空白行です

それで:

  • 最後に [h] がある行だけを保持し、他のすべてを銀行行に置き換えるにはどうすればよいですか? (改行が残っていることを意味します)
  • 同じ行を保持しながら [h] を削除するにはどうすればよいですか?





ああああああああああああああああああああああああああああああああああああああああああああああああああああああ




ああああああ

タイトルが示すように、私が必要としているのは次のようにも説明できると思います。指定された式に一致する行以外の行を置き換えます。

4

1 に答える 1

2

何を見つける:

^.*$(?<!\[h\])

何も置き換えないでください。必ずチェックを外してください. matches newline

それはどのように機能しますか?

^        # matches the beginning of a line (after the line break)
.*       # matches as many non-line-break characters as possible (an entire line)
$        # matches the end of a line (before the line break)
(?<!     # a negative lookbehind, if it's contents match left of the current
         # position, it causes the pattern to fail
  \[h\]  # match [h] literally
)        # end of lookbehind

ルックアラウンドは一致の一部ではないことに注意してください。したがって^.*$、行の一部や複数の行ではなく、行全体が一致していることを確認してください。後読みは、一致した行が で終わっていないことを保証し[h]ます。

[h]その後、追加の手順で を削除できます。

何を見つける:\[h\]$

何も置き換えないでください。

編集:正規表現エンジンがファイルを最初から最後までトラバースするという事実と、一致が重複しないという事実により、実際には両方のパターンを 1 つにまとめることができます。

^.*$(?<!\[h\])|\[h\]$

[h]行末の が削除されるまでに、エンジンはその行を再度確認しないため、最後に があった行だけが残ります[h]

于 2013-04-29T23:59:51.570 に答える