7

特定の形式に従う一連のグループ化された値があり、単一の式を使用してそれらをグループにキャプチャしたいと考えています。たとえば、私はこれ-group1 -group2 -group3に似たものを使用しようとしています。(-[\s\S]{1,}?) これにより、基本的に文字列全体を1つのグループにまとめることができますが、各値を個別に逆参照できるようにしたいと思います。私は?それが貪欲ではないことを強制するだろうと考えたので、パターンマッチを3つの別々のグループに分割しました(たとえば)。今のところ、私は単に参照を繰り返しています(-[\s\S]*?)が、もっとエレガントな表現があるはずです。
ありがとう!

4

3 に答える 3

16

C# は (唯一ではないにしても) 部分式のキャプチャをサポートする数少ない言語の 1 つであるため、幸運です。

https://msdn.microsoft.com/en-us/library/system.text.regularexpressions.capture(v=vs.110)

.NET API は次のように見ることができます。

 Matches
     Groups (most regex engines stop here)
         Captures (unique for .NET)

あなたの質問からは、正確に何を一致させたいのか明確ではありませんが、これで始められるはずです。行き詰まったらまた質問してください。

  string input = "-group1 -group2 ";
  string pattern = @"(-\S*\W){2}";
  foreach (Match match in Regex.Matches(input, pattern))
  {
     Console.WriteLine("Match: {0}", match.Value);
     for (int groupCtr = 0; groupCtr < match.Groups.Count; groupCtr++)
     {
        Group group = match.Groups[groupCtr];
        Console.WriteLine("   Group {0}: {1}", groupCtr, group.Value);
        for (int captureCtr = 0; captureCtr < group.Captures.Count; captureCtr++)
           Console.WriteLine("      Capture {0}: {1}", captureCtr, 
                             group.Captures[captureCtr].Value);
     }                      
  } 

これは出力します

Match: -group1 -group2 
   Group 0: -group1 -group2 
      Capture 0: -group1 -group2 
   Group 1: -group2 
      Capture 0: -group1 
      Capture 1: -group2 

ご覧のとおり、(Group 1, Capture 0) と (Group 1, Capture 1) は、グループの個々のキャプチャを提供します (ほとんどの言語のように最後ではありません)。

このアドレスは、「各値を個別に逆参照できるようにする」とあなたが説明しているものだと思います

(後方参照という言葉を使っていますが、置換パターンを狙っているとは思いませんよね?)

于 2012-06-15T13:51:14.673 に答える
2

.NET 正規表現 (およびほとんど .NET のみ) を使用すると、次を使用できます。

(?:(-\S+)\s*)+

グループ 1 には、一致したすべての部分文字列のリストが含まれます。

またはMatches、あなたの場合は使用するだけで十分です:

var re = new Regex(@"-\S+");
var matches = re.Matches(str);
于 2012-06-15T13:35:58.183 に答える
0

これを試して:

(-.+?)(\s|$)

最初のキャプチャ グループには、必要なもの ( -group1-group2など) が含まれます。

の後に何を許可するかをさらに制御したい場合は、たとえば、英数字のみに一致するよう-に変更します。.+?[a-zA-Z0-9]+?

于 2012-06-15T13:32:07.053 に答える