.NET中的正则表达式(我使用的是4.5.2)似乎有三种(非静态)匹配方法:
regex.Match(string input)
在input
。{/ li>中搜索第一个匹配项
regex.Match(string input, int startIndex)
从input
开始搜索startIndex
中的第一场比赛。regex.Match(string input, int startIndex, int length)
搜索由input
和startIndex
定义的length
范围内的第一个匹配项。如果我写
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.Success
是True
,正如预期的那样。 regex
与abc
开头的str
匹配。
如果我再写
int index = 4;
match = regex.Match(str, index);
System.Diagnostics.Debug.WriteLine(match.Success);
从索引4搜索到str
的结尾,然后我看到match.Success
是False
,正如预期的那样。索引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方法中获得一致的字符串起始锚定行为?
答案 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,则所有匹配都不是真正的开始字符串。但是,返回的索引是正确的,因此对我来说似乎是一个错误。