2012-01-18 10 views
3

問題!

私はフラットファイル(数値入力の話)から以下の入力(ルールを)持っている:C#正規表現のトラブル

  • 入力は(1000年未満)の自然数であるかもしれない:1, 10, 100, 999, ...
  • 入力はカンマ区切りであるかもしれません(1000年、上記)引用符で囲まれた数:私は最初のミリアンペアに期待してい10などの入力のために(?:(\d+)|\x22([0-9]+(?:,[0-9]+)*)\x22):だから、私は入力を検証するために、次の正規表現をお持ちの"1,000", "2,000", "3,000", "10,000", ...

私はちょうど私が得たものです10、グループを傾聴する。しかし、"10,000"のような入力があったとき、私は最初の一致グループ10,000を期待していますが、2番目の一致するグループに格納されています。

string text1 = "\"" + "10,000" + "\""; 
string text2 = "50"; 

string pattern = @"(\d+)|\x22([0-9]+(?:,[0-9]+){0,})\x22"; 

Match match1 = Regex.Match(text1, pattern); 
Match match2 = Regex.Match(text2, pattern); 

if (match1.Success) 
{ 
    Console.WriteLine("Match#1 Group#1: " + match1.Groups[1].Value); 
    Console.WriteLine("Match#1 Group#2: " + match1.Groups[2].Value); 

    # Outputs 
    # Match#1 Group#1: 
    # Match#1 Group#2: 10,000 
} 

if (match2.Success) 
{ 
    Console.WriteLine("Match#2 Group#1: " + match2.Groups[1].Value); 
    Console.WriteLine("Match#2 Group#2: " + match2.Groups[2].Value); 

    # Outputs 
    # Match#2 Group#1: 50 
    # Match#2 Group#2: 
} 

期待される結果、この場合

同じマッチング・グループの両方の結果、1

質問?

  • 私は間違っていますか?私はちょうど正規表現のマッチから悪いグループ分けを取得しています。
  • また、ファイルを解析するためにfilehelpers .NETを使用していますが、この問題を解決する他の方法はありますか。実際に私はカスタムコンバータを実装しようとしています。

オブジェクトファイル

[FieldConverter(typeof(OOR_Quantity))] 
public Int32 Quantity; 

OOR_Quantity

internal class OOR_Quantity : ConverterBase 
{ 
    public override object StringToField(string from) 
    { 
     string pattern = @"(?:(\d+)|\x22([0-9]+(?:,[0-9]+)*)\x22)"; 
     Regex regex = new Regex(pattern); 

     if (regex.IsMatch(from)) 
     { 
      Match match = regex.Match(from); 
      return int.Parse(match.Groups[1].Value); 
     } 

     throw new ... 
    } 
} 

答えて

5

グループ番号は、正規表現におけるそれらの位置に基づいて純粋に割り当てられている - すなわち、の相対位置を開きブラケット、(。あなたの正規表現では(\d+)が最初のグループで、([0-9]+(?:,[0-9]+)*)が2番目のグループです。

@"(?:(?<NUMBER>\d+)|\x22(?<NUMBER>[0-9]+(?:,[0-9]+)*)\x22)" 

は今、あなたはmatch.Groups["NUMBER"].Valueとしてキャプチャされた値を取得できます。

あなたは、同じ識別子でそれらの両方を参照してくださいという名前のグループを使用し、それらに同じ名前の両方を与えたい場合は

+0

私が本当にこれを忘れたのか、まったくルールを誤解したのか分かりません。ありがとう! – Eder

0

私は、Rubyで以下の正規表現をテストした:

text1 = "\"10,000\"" 
text2 = "50" 

regex = /"?([0-9]+(?:,[0-9]+){0,})"?/ 

text1 =~ regex 
puts "#$1" 

text2 =~ regex 
puts "#$1" 

結果は次のとおりです。

10,000 
50 

私はあなたがC#で書き直すことができると思います。あなたのために十分ではありませんか?

+0

素敵で簡単な答えですが、二重引用符を表示しないように強制していません。 – Eder