1

次のコードがある場合:

Regex xp = new Regex(@"(\*\*)(.+?)\*\*|(\*)([^\*]+)\*");

string text = @"*hello* **world**";

MatchCollection r_Matches = xp.Matches(text);

foreach (Match m in r_Matches)
{
    Console.WriteLine(m.Groups[1].ToString());
    Console.WriteLine(m.Groups[3].ToString());
}

// Outputs:
// ''
// '*'
// '**'
// ''

上記の正規表現を実行して、OR の両側からの最初のコレクションの結果を同じ場所に表示するにはどうすればよいですか? (つまり、.Groups[1] は、またはのいずれ**かを返します。_これは、C# の正規表現がどのように機能するかではないと思いますが、これは達成可能ですか? もしそうなら、どのように?)

4

2 に答える 2

1

後方参照を使用できます

Regex xp = new Regex(@"(\*{1,2})(.+?)\1");

string text = @"*hello* **world**";

MatchCollection r_Matches = xp.Matches(text);

foreach (Match m in r_Matches)
{
    Console.WriteLine(m.Groups[1].ToString());
}

これは、以前に一致したもの (または)が正確に見つかるまで、任意の 1 つ以上の文字に一致する**か、その後に続きます。****

于 2013-08-07T21:32:46.973 に答える
0

コメンターの1人が言ったように、これには名前付きグループを使用できます。.NET は、正規表現のさまざまな部分で同じ名前を制限なしで使用できるという点で、他のほとんどの正規表現フレーバーよりも柔軟性があります。この正規表現では:

@"(?<delim>\*\*)(?<content>.+?)\*\*|(?<delim>\*)(?<content>[^*]+)\*"

...次のように、興味のある部分を抽出できます。

foreach (Match m in r_Matches)
{
    Console.WriteLine("Delimiter: {0}\nContent: {1}",
                      m.Groups["delim"].Value,
                      m.Groups["content"].Value);
}

それだけです。他のコメントの 1 つとは対照的に、GroupCollections や CaptureCollections などをいじる必要はありません。

この特定の問題は、ほとんどすべてのフレーバーで簡単に解決できることに注意してください。.NET がほとんどのものよりも柔軟であるというだけです。

于 2013-08-08T00:03:29.523 に答える