2017-09-14 10 views
1

文(文字列)が一致するかどうかを調べようとするこの正規表現パターンがあります。C#Regex - 反復可能なグループから値を取得する

私パターン:私のパターンを読み取る方法

@"^A\s(?<TERM1>[A-Z][a-z]{1,})\sconsists\sof\s((?<MINIMUM1>(\d+))\sto\s(?<MAXIMUM1>(\d+|many){1})|(?<MINMAX1>(\d+|many{1}){1}){1})\s(?<TERM2>[A-Z][a-z]{1,})(\sand\s((?#********RepeatablePart********)(?<MININUM2>(\d+))\sto\s(?<MAXIMUM2>(\d+|many){1})|(?<MINMAX2>(\d+|many{1}){1}){1})\s(?<TERM3>([A-Z][a-z]{1,})))+\.$" 

A (TERM1) consists of (MINIMUM1 to (MAXIMUM1|many)|(MINMAX1|many)) (TERM2) ((?#********RepeatablePart********)and (MINIMUM2 to (MAXIMUM2|many)|(MINMAX|many)) (TERM3))+. 

MINMAX1/MINMAX2は、 '多くの' 番号や言葉だけかもしれないとMINIMUM1/MINIMUM2が数値であるとMAXIMUM1/MAXIMUM2は数字または 'many'という単語になります。

例文:

  1. A車は、Windows 6に2〜5の座席と1 Breakpedal及び1 Gaspedal及び4から成ります。
  2. 樹木は多くのリンゴと2〜多くの色と0〜1リスと多くの葉で構成されています。
  3. ブックは、1人以上の著者と1タイトルと3ブックマークで構成されています。

    1. を含むであろう:TERM1 =カー、MINIMUM1 = 2、MAXIMUM1 = 5、MINMAX1 =ヌル、TERM2 =椅子、MINIMUM2 =ヌル、MAXIMUM2 =ヌル、MINMAX2 = 1、TERM3 = Breakpedal、MINIMUM2 =ヌル、MAXIMUM2 TERM1 =ヌル、MAXIMUM1 =ヌル、MINMAX1 =多数、TERM2 = 1、TERM3 = Gaspedal、MINIMUM2 = 4、MAXIMUM2 = 6、MINMAX2 = MINIMUM2 = 0、MAXIMUM2 = 0、MINIMUM2 = null、TERM3 =リス、MINIMUM2 = null、MAXIMUM2 = null、MINMAX2 = many、TERM3 = Leaves
    2. は、TERM1 =ブック、MINIMUM1 = 1、MAXIMUM1 =多数、MINMAX1 =ヌル、TERM2 =著者、MIN IMUM2 =ヌル、MAXIMUM2 =ヌル、MINMAX2 = 1、TERM3 =タイトル、MINIMUM2 =ヌル、MAXIMUM2 =ヌル、MINMAX2 = 3、TERM3 =ブックマーク

私はいっぱいしたいクラスを作成しました私の文字列で、反復部分(MINIMUM2、MAXIMUM2、MINMAXとTERM3の話す)の値を使用して:私のパターンは、反復部分(+)を持っているので

//MyObject contains the values of one expression from the repateatable part. 
public class MyObject 
{ 
    public string term { get; set; } 
    public string min { get; set; } 
    public string max { get; set; } 
    public string minmax { get; set; } 
} 

私は新しいを追加するリストを作成したいです返すことができるグループの値を記入したいobject(MyObject)。

私の問題は、繰り返し可能な部分の値をオブジェクトに埋め込む方法がわかりません。 文(例えば、「1冊の本は1〜複数の著者と1つのタイトルと3つのブックマークで構成されています。」)がMINIMUM2を1つも持たないので、リストの値が同じではないため、 1つのMAXIMUM2と1つのMINMAX2を繰り返します。

私のオブジェクトを簡単に埋める方法はありますか、量子部分からどのように値を得ることができますか? (C#の場合)

マイコード:

var match = Regex.Match(exampleText, pattern); 
if (match.Success) 
{ 

    string term1 = match.Groups["TERM1"].Value; 
    string minimum1 = match.Groups["MINIMUM1"].Value; 
    string maximum1 = match.Groups["MAXIMUM1"].Value; 
    string minmax1 = match.Groups["MINMAX1"].Value; 
    string term2 = match.Groups["TERM2"].Value; 

    //--> Groups[].Captures..ToList() might be wrong. Maybe there is a better way to get the values of the reapeatable Part 
    List<string> minimums2 = match.Groups["MINIMUM2"].Captures.Cast<Capture>().Select(x => x.Value).ToList<string>(); 
    List<string> maximums2 = match.Groups["MAXIMUM2"].Captures.Cast<Capture>().Select(x => x.Value).ToList<string>(); 
    List<string> minmaxs2 = match.Groups["MINMAX2"].Captures.Cast<Capture>().Select(x => x.Value).ToList<string>(); 
    List<string> terms3 = match.Groups["TERM3"].Captures.Cast<Capture>().Select(x => x.Value).ToList<string>(); 

    List<MyObject> myList = new List<MyObject>(); 

    for (int i = 0; i<terms3.Count; i++) 
    { 
     myList.Add(new MyObject() 
      { 
      term = terms3[i], 
      min = minimums2[i] //-->ERROR MIGHT HAPPEN when List<string>minimums2 doesn't have the same amount of values like List<string> terms3 
      max = maximums2[i] //-->ERROR.. 
      minmax = minmaxs2[i] //-->ERROR... 
      }); 
    } 
} 
私は言葉「と」私はのすべてのフレーズが含まれている文字列「splittedText」を持った後、私のexampleTextを分割することにより、自分で自分の問題を解決することができ

答えて

0

私のパターンの反復可能な部分。私exampleTextを分割した後

string[] splittedText = Regex.Split(exampleText, @"\sand\s"); 

私は、forループ私は各フレーズのうち、必要な値を取得するために別のregex.matchを行うにはmyObjectというに各単一フレーズの値を挿入します。

string pattern2 =(((?#********RepeatablePart********)(?<MININUM2>(\d+))\sto\s(?<MAXIMUM2>(\d+|many){1})|(?<MINMAX2>(\d+|many{1}){1}){1})\s(?<TERM3>([A-Z][a-z]{1,})))+\.$ 
List<MyObject> myList = new List<MyObject>(); 

//i = 1 -> since splittedText[0] contains the beginning of the sentence (e.g. 'A Car consists of 2 to 5 Seats') 
for (int i = 1; i<splittedText.Count(); i++) 
{     
    var match2 = Regex.Match(splittedText[i], pattern2); 
    if (match2.Success) 
    {      
     myList.Add(new MyObject() 
     { 
      term = match2.Groups["TERM3"].Value,    
      min = match2.Groups["MININUM2"].Value, 
      max = match2.Groups["MAXIMUM2"].Value, 
      minmax = match2.Groups["MINMAX2"].Value 
     }); 

    } 
} 
関連する問題