38

さて、notepad++で9番目の後方参照を超えてグループ化しようとしています。ウィキには、グループ命名を使用して9番目の参照を通過できると書かれています。ただし、一致する構文を正しく取得できないようです。簡単にするために、2つのグループから始めます。

サンプルデータ

1000,1000

正規表現。

(?'a'[0-9]*),([0-9]*)

ドキュメントによると、私は次のことをする必要があります。

(?<some name>...), (?'some name'...),(?(some name)...)
Names this group some name.

ただし、結果として、テキストが見つかりません。助言がありますか?

4

4 に答える 4

38

10未満のグループと同じ方法で、9を超えるグループを簡単に参照できます。

つまり、$10は10番目のグループです。

(ナイーブな)例の場合:

文字列:

abcdefghijklmnopqrstuvwxyz

正規表現の検索:

(?:a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)(m)(n)(o)(p)

交換:

$ 10

結果:

kqrstuvwxyz

私のテストはNotepad++v6.1.2で実行され、期待した結果が得られました。

更新:これはv7.5.6の時点でも機能します


SarcasticSullyはこれを復活させて質問をしました:

「最初のグループの後に文字「0」を付けて置き換えたい場合はどうなりますか?」

これを行うには、置換を次のように変更します。

$ 1 \ x30

これはグループ1と16進文字に置き換えられています30-これは0ASCIIです。

于 2012-06-06T14:15:12.340 に答える
4

(私がしたように)グーグルからここに着陸する他の人を助けるための非常に遅れた答え。notepad ++置換での名前付き後方参照は、次のようになります $+{name}。理由はともかく。

ここでは、標準の正規表現の落とし穴とは異なりますが、名前付きの後方参照にも番号が付けられています。標準の正規表現では、を持っている場合は(.*)(?<name> & )(.*)、で置き換えて、最初に使用し$1${name}$2たのとまったく同じ行を取得します。notepad ++では、を使用する必要があります$1$+{name}$3


例: 構成が一致しない場合は、VisualStudio.slnファイルをクリーンアップする必要がありました。置き換える必要のあるテキストは次のようになりました。

    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|Any CPU.Build.0 = Debug|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|x64.ActiveCfg = Debug|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|x64.Build.0 = Debug|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|x86.ActiveCfg = Debug|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|x86.Build.0 = Debug|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|Any CPU.ActiveCfg = Release|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|Any CPU.Build.0 = Release|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|x64.ActiveCfg = Release|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|x64.Build.0 = Release|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|x86.ActiveCfg = Release|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|x86.Build.0 = Release|Any CPU


私の検索正規表現:

  ^(\s*\{[^}]*\}\.)(?<config>[a-zA-Z0-9]+\|[a-zA-Z0-9 ]+)*(\..+=\s*)(.*)$

私の交換用正規表現:

  $1$+{config}$3$+{config}

結果:

    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|Any CPU.ActiveCfg = Dev|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|Any CPU.Build.0 = Dev|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|x64.ActiveCfg = Dev|x64
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|x64.Build.0 = Dev|x64
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|x86.ActiveCfg = Dev|x86
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|x86.Build.0 = Dev|x86
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|Any CPU.ActiveCfg = QA|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|Any CPU.Build.0 = QA|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|x64.ActiveCfg = QA|x64
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|x64.Build.0 = QA|x64
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|x86.ActiveCfg = QA|x86
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|x86.Build.0 = QA|x86

これが誰かを助けることを願っています。

于 2016-06-03T19:38:54.517 に答える
2

\ xでグループを参照する通常の構文は、\10をグループ1の後に0が続く参照として解釈
します。代わりに$xと$10の代替構文を使用する必要があります。

注:10のグループを持つ理由があるのではないかと疑う人もいるようです。
単純なものがあります。
<name_start> DDMMYYYY_TIME_DDMMYYYY_TIME <name_end>という名前のファイルのグループの名前を<name_start> YYYYMMDD_TIME_YYYYMMDD_TIME <name_end>に変更
し、入力一致を次のように置き換えて終了しました:
rename "\ 1" "\ 2 \ 5 name_startとname_endは常に一定ではなかったため、\ 4 \ 3_ \ 6_ \ 9 \ 8 \ 7_ $10"。

于 2020-11-02T08:11:57.050 に答える
1

OK、マッチングは問題ありません。あなたの例は現在のNotepad++で私にマッチします。これは重要なポイントです。Notepad++でPCRE正規表現を使用するには、バージョン>=6.0が必要です

もう1つのポイントは、後方参照をどこで使用するかということです。正規表現内では問題なく名前付き後方参照を使用できますが、置換文字列では使用できません。

意味

(?'a'[0-9]*),([0-9]*),\g{a}

一致します

1000,1001,1000

しかし、名前付きグループまたは置換文字列で9を超えるグループを使用する方法がわかりません。

置換文字列に9つを超える後方参照が本当に必要ですか?9つを超えるグループが必要で、すべてが置換に含まれているわけではない場合は、グループの先頭にを追加して、キャプチャされていないグループを再利用する必要のないグループを作成します。?:

(?:[0-9]*),([0-9]*),(?:[0-9]*),([0-9]*)
           group 1             group 2
于 2012-06-06T06:47:37.373 に答える