2017-06-27 13 views
-3

注文番号とそれぞれの注文ライン商品名を抽出する正規表現が必要です。OrderとOrderLineアンカーは定数です。私は順序をキャプチャする正規表現を書くことができ、最初の注文行だけを管理しました。誰か助言してもらえますか?シンプルな1レベル階層をキャプチャする正規表現

ありがとうございます。

文書例:OrderLine

Order 123 
OrderLine Some Product 1 
OrderLine Some Product 2 

Order 124 
OrderLine Some Product 1 
OrderLine Some Product 1 

Some Text 
+3

すでに書いている正規表現を入力してください。 – Orace

+2

C#と 'preg_match'?あなたが使用しているハイブリッドは何ですか? –

+0

1つの「注文」に無限の「注文線」がありますか?あるいは、彼らはいつも二人ですか? – horcrux

答えて

0

繰り返しキャプチャは(+または*修飾子を追加します)。

Capturesとして、Groupプロパティには、キャプチャグループと一致するすべてのキャプチャが含まれています。

整形式の文書では、グループproductNameproductQuantityは同じ数のキャプチャを持ちます。あなたはそれを反復するだけです。

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を使用し、それ以上の反復はグループが一致コレクションではないため不可能です。

関連する問題