web-dev-qa-db-ja.com

9番目の後方参照を超えて正規表現をグループ化するにはどうすればよいですか?

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

サンプルデータ

1000,1000

正規表現

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

docs によると、私は次のことをする必要があります。

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

しかし、その結果、私のテキストが見つかりません。助言がありますか?

32
meanbunny

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

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


例:構成の不一致がないかVisual Studio.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

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

3
James King

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
1
stema