2012-10-02 74 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

你的意思是,这不是唯一的问题。我之前没有发现的另一个问题是前瞻断言(?=)。我正在编辑我的回复以包含此错误。 –