2012-10-02 76 views
1
const string numericReg = "\\d+"; // Matches a digit character. Equivalent to [0-9]. 
const string realNumsReg = numericReg + b + "(\\." + b + numericReg + ")?"; 
     const string b = "\\s*"; 

這種說法是正確的:正則表達式=>兩場比賽之間前瞻C#

private const string rte = "(?<rate>" + realNumsReg + ")" + 
          "(?=(?<rte1>" + b + "qs " + "))"; 

這種說法是正確的:

private const string barl = "(?<barl>" + numericReg + ")" + 
            "(?=((?<q>" + b + "point to print)))"; 

這是RTE真:

MatchCollection s = Regex.Matches 
       ("3000 qs/min", rte , RegexOptions.IgnoreCase); 

這是BARL真:

MatchCollection s = Regex.Matches 
       ("6 point to print ", barl , RegexOptions.IgnoreCase); 

爲什麼這是錯?

MatchCollection s = Regex.Matches 
       ("6 point to print 3000 qs/ min", barl+b+rte , RegexOptions.IgnoreCase); 

回答

0

第一個問題: 在3000逗號( '')。 第一個匹配符合「000 rds」 第三個Regex.Matches中沒有與「3」匹配的內容。

第二(不太明顯的問題):

兩個向前看斷言(?= 表達),是斷言不匹配,所以沒有什麼是匹配無論是在第三正則表達式的第一個斷言內。

在你的情況: 'BARL' + 'B' + 'RTE'

'BARL' 匹配 '每安裝6桶' 的 '6', 'B' 的空間相匹配 '6' 之間和'桶'('每次裝桶'由前瞻斷言但不匹配)和'rte'不能匹配一個數字後跟'rds'。

只需從表情中移除逗號和縮略圖,您並不需要它們,因爲您感興趣的組無論如何都被命名,並且匹配的組可以很容易地從Match組中收集。

改進:

  1. 您可能要更改RTE也匹配 'QS /分鐘' 不只是QS的 '/分鐘'。
  2. 將numericReg更改爲@「\ d +(,\ d {3})*(。\ d +)?」 (匹配任意數量的數字,後跟零個或多個逗號和正好3個數字組,以及一個或一個點後面跟着數字的組)。的形式此正則表達式匹配號碼:3000 3000 3,000.0000
+0

這是沒有問題的。 –

+0

我刪除了逗號。再次沒有工作 –

+0

你的意思是,這不是唯一的問題。我之前沒有發現的另一個問題是前瞻斷言(?=)。我正在編輯我的回覆以包含此錯誤。 –