有些人知道为什么输出这段代码:
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”参数应该对什么有用)。
这个想法是这个正则表达式匹配(并且有很多它们)经常被调用(每秒几千),我们发现子字符串操作会破坏内存性能。
感谢您的帮助!
答案 0 :(得分:17)
根据MSDN
如果你想限制匹配,那么 它始于一个特定的 字符串中的字符位置和 正则表达式引擎没有 扫描字符串的剩余部分 匹配,锚定正则表达式 用\ G(左边是一个 从左到右的图案,或在右边 从右到左的模式)。这个 限制匹配,因此必须开始 恰好在startat。
正则表达式与整个字符串匹配,您需要使用\ G而不是^
答案 1 :(得分:0)
听起来你是对的 - 你对^
的含义感到困惑。 ^
表示您正在使用的行的开头。 ^bar
只会将开始的行与“bar”相匹配,而您在那里人工完成了Substring
。如果您解释一下您正在尝试用它做什么,我们可能会帮助您。
顺便说一句,Substring
应该显着比大多数正则表达式操作更快。如果那是在扼杀你的表现,我会感到惊讶。