2012-01-18 70 views
3

問題!

我從一個平面文件下面輸入(規則)(談論數字輸入):C#正則表達式問題

  • 輸入可能是一個自然數(低於1000):1, 10, 100, 999, ...
  • 輸入可能是一個逗號分隔在雙引號(1000以上)數目:"1,000", "2,000", "3,000", "10,000", ...

我有以下正則表達式來驗證輸入:(?:(\d+)|\x22([0-9]+(?:,[0-9]+)*)\x22),所以對於像10我期待在第一毫安的輸入tching group 10,這正是我所得到的。但是當我得到像"10,000"這樣的輸入時,我期待在第一個匹配組10,000中,但它存儲在第二個匹配組中。

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解析文件,有沒有其他方法可以解決此問題。 Actualy我試圖實現一個自定義轉換器。

對象文件

[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]+)*)是第二組。

如果你想引用他們都是具有相同的標識符,使用命名組,給他們倆同一個名字:

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

現在你可以檢索捕捉的值作爲match.Groups["NUMBER"].Value

+0

我不知道我是否真的忘了這件事,或者我完全誤解了規則。謝謝! – Eder 2012-01-18 01:42:57

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 2012-01-18 01:40:52