2016-06-29 12 views
2

私はこのような表現を持っていると私はtotalamountとminamount複数の正規表現パターン

"test test test test totalamount(32604) > 0m)" 
"test test test test totalamount(32604, 13456) > 0m)" 
"test test test test minamount(32604) > 0m)" 
"test test test test minamount(32604, 34677, 12345) > 0m)" 

からちょうど後の括弧内の数字だけにマッチしたい、私は右のパターンを持つことができるのであれば、私の出力は

する必要があります
1- 32604 
2- 32604, 13456 
3- 32604 
4- 32604, 34677, 12345 





Regex regex = new Regex(@"(totalamount)\((\d*)(\,\d*)"); 
Regex regex2 = new Regex(@"(totalamount)\((\d*)(\d*)"); 
Regex regex3 = new Regex(@"(minamount)\((\d*)(\,\d*)"); 
Regex regex4 = new Regex(@"(minamount)\((\d*)(\d*)"); 

return regex.Match(expression).Success ? regex.Match(expression) : 
        regex2.Match(expression).Success ? regex2.Match(expression): 
        regex3.Match(expression).Success ? regex3.Match(expression) : 
        regex4.Match(expression).Success ? regex4.Match(expression) : null; 

ここに私の解決策がありますが、最悪の解決策は、私の場合にマッチするためのより良い方法でなければならないと考えています。誰でも助けてくれますか?ここで

+0

あなたは "よりよい解決策は" ある意味しますか?そうでない場合は、具体的にしてください。 –

+0

ヒープシングル正規表現パターンは絶対に良い解決策になります –

答えて

5

別の解決策:

List<string> ls = new List<string>() 
       { 
       "test test test test totalamount(32604) > 0m)", 
       "test test test test totalamount(32604, 13456) > 0m)", 
       "test test test test minamount(32604) > 0m)", 
       "test test test test minamount(32604, 34677, 12345) > 0m)" 
       }; 

string pattern = @"(?<=(?:total|min)amount\(|\G(?!^)[ ,]*)\d+"; 
var result = ls.SelectMany(s => 
      Regex.Matches(s, pattern).Cast<Match>() 
        .Select(m=>Convert.ToInt32(m.Value))) 
       .ToList(); 

戻り値(List<int>):

32604 
32604 
13456 
32604 
32604 
34677 
12345 
+0

最初のコメントが受け入れられましたthanks –

+0

ありがとう、@MehmetErenYener。 –

6

が変更を使用して、単一の正規表現パターンと私のソリューションです:

(?<=(total|min)(amount)\()\d*((\,)*\d*)* 
2

私はないんだけどなぜ以前の2つのソリューションがルックアサージュを必要としているのかはっきりしていますが、ここには単純なものがあります:

(total|min)amount\(([\d,\s]+)\) 

これは、引数リストに一致し、インデックス2MatchGroupsプロパティを介してアクセスされるキャプチャグループ$2に格納されます。

例:

var expressions = new [] 
{ 
    "test test test test totalamount(32604) > 0m)", 
    "test test test test totalamount(32604, 13456) > 0m)", 
    "test test test test minamount(32604) > 0m)", 
    "test test test test minamount(32604, 34677, 12345) > 0m)" 
}; 


var numbers = new Regex(@"(total|min)amount\(([\d,\s]+)\)"); 

foreach (var expression in expressions) 
    Console.WriteLine(numbers.Match(expression).Groups[2]); 

の作業の例では、単一の正規表現パターン:https://dotnetfiddle.net/m3iXF5