Regex.Match,startat和^(字符串的开头)

Vin*_*bbe 22 c# regex

有人知道为什么这段代码的输出:

Regex re = new Regex("^bar", RegexOptions.Compiled);
string fooBarString = @"foo bar";

Match match1 = re.Match(fooBarString, 4);
Console.WriteLine(String.Format("Match 1 sucess: {0}", match1.Success));

Match match2 = re.Match(fooBarString.Substring(4));
Console.WriteLine(String.Format("Match 2 sucess: {0}", match2.Success));
Run Code Online (Sandbox Code Playgroud)

是:

比赛1成功:错误

比赛2成功:是的

预期的行为当然是"真"和"真"(否则我真的不知道"startat"参数应该对什么有用).

这个想法是这个正则表达式匹配(并且有很多它们)经常被调用(每秒几千),我们发现子串操作正在扼杀内存性能.

谢谢你的帮助!

小智 19

根据MSDN

如果要限制匹配以使其从字符串中的特定字符位置开始并且正则表达式引擎不扫描字符串的其余部分以进行匹配,则使用\ G锚定正则表达式(在左侧为从左到右的图案,或在右边从右到左的图案).这限制了匹配,因此它必须在startat处准确启动.

正则表达式与整个字符串匹配,您需要使用\ G而不是^

http://msdn.microsoft.com/en-us/library/3583dcyh.aspx