繰り返しキャプチャは(+または*修飾子を追加します)。
Capturesとして、Groupプロパティには、キャプチャグループと一致するすべてのキャプチャが含まれています。
整形式の文書では、グループproductName
とproductQuantity
は同じ数のキャプチャを持ちます。あなたはそれを反復するだけです。
var test = @"Order 123
OrderLine Apple Tree 1
OrderLine Ananas 2
Order 124
OrderLine Tree 1
OrderLine RainBow Warrior 1";
var regEx = new Regex(@"(Order (?<orderId>\d+)(?<orderLines>\s*OrderLine\s*(?<productName>.*)\s*(?<productQuantity>\d+))+)+");
var result = regEx.Matches(test);
foreach (Match match in result)
{
var orderId = match.Groups["orderId"];
var productNames = match.Groups["productName"].Captures;
var productQuantities = match.Groups["productQuantity"].Captures;
if (productNames.Count != productQuantities.Count)
{
throw new Exception();
}
Console.WriteLine($"Order {orderId}");
for (var i = 0; i < productNames.Count; i++)
{
var productName = productNames[i].Value;
var productQuantity = productQuantities[i].Value;
Console.WriteLine($" {productQuantity} | {productName}");
}
}
出力:悲しいこと
Order 123
1 | Apple Tree
2 | Ananas
Order 124
1 | Tree
1 | RainBow Warrior
、私はキャプチャ長チェックを回避する方法を見つけることができません。 orderLines
を使用し、それ以上の反復はグループが一致コレクションではないため不可能です。
すでに書いている正規表現を入力してください。 – Orace
C#と 'preg_match'?あなたが使用しているハイブリッドは何ですか? –
1つの「注文」に無限の「注文線」がありますか?あるいは、彼らはいつも二人ですか? – horcrux