.NET(我正在使用4.5.2)中的正则表达式似乎具有三种(非静态)Match方法:
regex.Match(string input)
在中搜索第一个匹配项input
。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
,正如预期的那样。abc
在索引4处有一个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方法中获得一致的字符串起始锚行为?
从Regex.cs源代码中的注释中,我看到可以public Match Match(String input, int startat)
找到第一个匹配项,从指定位置开始并public Match Match(String input, int beginning, int length)
找到第一个匹配项,从而将搜索限制在char数组的指定间隔内。
结合您的测试结果(和mine),很明显,该Regex.Match
方法的最后一个重载将子字符串作为一个新的单独的字符串,并将其传递给regex引擎。没有改变^
,以\A
将有所帮助。
因此,要知道匹配项是否是真正的开始,您应该在自己的代码中添加逻辑,例如,如果index
大于0,则所有匹配项都不是字符串的真正开始。但是,返回的索引是正确的,因此对我来说似乎是个错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句