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

时间:2011-05-04 14:23:52

标签: 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));

是:

  

匹配1成功:错误

     

比赛2成功:真实

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

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

感谢您的帮助!

2 个答案:

答案 0 :(得分:17)

根据MSDN

  

如果你想限制匹配,那么   它始于一个特定的   字符串中的字符位置和   正则表达式引擎没有   扫描字符串的剩余部分   匹配,锚定正则表达式   用\ G(左边是一个   从左到右的图案,或在右边   从右到左的模式)。这个   限制匹配,因此必须开始   恰好在startat。

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

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

答案 1 :(得分:0)

听起来你是对的 - 你对^的含义感到困惑。 ^表示您正在使用的行的开头。 ^bar只会将开始的行与“bar”相匹配,而您在那里人工完成了Substring。如果您解释一下您正在尝试用它做什么,我们可能会帮助您。

顺便说一句,Substring应该显着比大多数正则表达式操作更快。如果那是在扼杀你的表现,我会感到惊讶。