.NET Regex Match方法

时间:2016-01-06 21:55:08

标签: c# .net regex

.NET中的正则表达式(我使用的是4.5.2)似乎有三种(非静态)匹配方法:

  1. regex.Match(string input)input。{/ li>中搜索第一个匹配项
  2. regex.Match(string input, int startIndex)input开始搜索startIndex中的第一场比赛。
  3. regex.Match(string input, int startIndex, int length)搜索由inputstartIndex定义的length范围内的第一个匹配项。
  4. 如果我写

    System.Text.RegularExpressions.Regex regex =
        new System.Text.RegularExpressions.Regex("^abc");
    string str = "abc abc";
    
    System.Text.RegularExpressions.Match match = regex.Match(str);
    System.Diagnostics.Debug.WriteLine(match.Success);
    

    然后我发现match.SuccessTrue,正如预期的那样。 regexabc开头的str匹配。

    如果我再写

    int index = 4;
    match = regex.Match(str, index);
    System.Diagnostics.Debug.WriteLine(match.Success);
    

    从索引4搜索到str的结尾,然后我看到match.SuccessFalse,正如预期的那样。索引4为abc时有str,但索引4不是字符串的开头。

    但是,如果我写

    match = regex.Match(str, index, str.Length - index);
    System.Diagnostics.Debug.WriteLine(match.Success);
    System.Diagnostics.Debug.WriteLine(match.Index);
    

    再次从索引4搜索到str的结尾,然后我看到match.Success意外True,而match.Index是4.我希望得到与调用regex.Match(str, index)相同的结果。

    有没有办法在.NET Regex Match方法中获得一致的字符串起始锚定行为?

1 个答案:

答案 0 :(得分:1)

根据Regex.cs source code中的评论,我看到public Match Match(String input, int startat) 找到第一个匹配项,从指定位置开始并且public Match Match(String input, int beginning, int length) 找到第一次匹配,将搜索限制为char数组的指定间隔

结合您的测试结果(和mine),很明显Regex.Match方法的最后一次重载将子字符串作为新的单独字符串并将其传递给正则表达式引擎。不将^更改为\A会有所帮助。

因此,要知道匹配是否真正开始,您应该只将逻辑添加到您自己的代码中,例如,如果index大于0,则所有匹配都不是真正的开始字符串。但是,返回的索引是正确的,因此对我来说似乎是一个错误