特定の形式に従う一連のグループ化された値があり、単一の式を使用してそれらをグループにキャプチャしたいと考えています。たとえば、私はこれ-group1 -group2 -group3
に似たものを使用しようとしています。(-[\s\S]{1,}?)
これにより、基本的に文字列全体を1つのグループにまとめることができますが、各値を個別に逆参照できるようにしたいと思います。私は?
それが貪欲ではないことを強制するだろうと考えたので、パターンマッチを3つの別々のグループに分割しました(たとえば)。今のところ、私は単に参照を繰り返しています(-[\s\S]*?)
が、もっとエレガントな表現があるはずです。
ありがとう!
3 に答える
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) は、グループの個々のキャプチャを提供します (ほとんどの言語のように最後ではありません)。
このアドレスは、「各値を個別に逆参照できるようにする」とあなたが説明しているものだと思います
(後方参照という言葉を使っていますが、置換パターンを狙っているとは思いませんよね?)
.NET 正規表現 (およびほとんど .NET のみ) を使用すると、次を使用できます。
(?:(-\S+)\s*)+
グループ 1 には、一致したすべての部分文字列のリストが含まれます。
またはMatches
、あなたの場合は使用するだけで十分です:
var re = new Regex(@"-\S+");
var matches = re.Matches(str);
これを試して:
(-.+?)(\s|$)
最初のキャプチャ グループには、必要なもの ( -group1
、-group2
など) が含まれます。
の後に何を許可するかをさらに制御したい場合は、たとえば、英数字のみに一致するよう-
に変更します。.+?
[a-zA-Z0-9]+?