regex =>两个匹配之间的前瞻c#

时间:2012-10-02 06:16:24

标签: regex c#-4.0 lookahead

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

1 个答案:

答案 0 :(得分:0)

第一个问题: 3,000中的逗号(',')。 第一个匹配匹配“000 rds” 在第三个Regex.Matches中没有任何东西可以匹配“3”。

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

两个前瞻断言(?= 表达式),断言不匹配,所以没有任何内容匹配第三个正则表达式中第一个断言内的内容。

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

'barl'匹配'每个安装6个桶'中的'6','b'匹配'6'和'桶'之间的空间('每个安装桶'由先行但未匹配确定)并且'rte'不能匹配后跟'rds'的数字。

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

改进:

  1. 你可能想要改变rte以匹配'qs / min'中的'/ min'而不仅仅是qs。
  2. 将numericReg更改为@“\ d +(,\ d {3})*(。\ d +)?” (匹配任意数字后跟零或多个逗号和正好3位数组以及一个点或一个点后跟数字的一个或零个组)。此正则表达式匹配表单的数字:3000 3,000 3,000.0000