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

这句话是真的:

  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);
4

1 回答 1

0

第一个问题:3,000 中的逗号 (',')。第一个匹配项匹配“000 rds” 第三个 Regex.Matches 中没有匹配“3”的内容。

第二个(不太明显的问题):

两个前瞻断言 (?= expression ) 是不匹配的断言,因此没有任何内容与第三个正则表达式中的第一个断言内的任何内容相匹配。

在你的情况下:'barl' + 'b' + 'rte'

'barl' 匹配 '6 buckets per mount' 中的 '6','b' 匹配 '6' 和 'barrels' 之间的空间('barrels per mount' 由前瞻断言但不匹配)和 'rte ' 不能匹配后跟 'rds' 的数字。

只需从表达式中删除逗号和前瞻,您实际上并不需要它们,因为您感兴趣的组无论如何都已命名,并且它们匹配的内容可以从 Match 中的 Groups 集合中轻松获得。

改进:

  1. 您可能想要更改 rte 以匹配 'qs/min' 中的 '/min' 而不仅仅是 qs。
  2. 将 numericReg 更改为 @"\d+(,\d{3})*(.\d+)?" (匹配任意数量的数字,后跟零个或多个逗号,正好是 3 个数字组和一个或零组点,后跟数字)。此正则表达式匹配以下形式的数字:3000 3,000 3,000.0000
于 2012-10-02T06:32:08.390 回答