Regex.Match, startat и ^ (начало строки)

Кто-нибудь знает, почему вывод этого кода:

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 sucess: False

Достижение 2: True

?

Ожидаемое поведение - это, конечно, "True" и "True" (иначе я действительно не знаю, для чего должен использоваться параметр "startat" ).

Идея состоит в том, что это регулярное совпадение (и их очень много) вызывается очень часто (несколько tousand в секунду), и мы обнаружили, что операции подстроки убивают производительность памяти.

Спасибо за вашу помощь!

Ответы

Ответ 1

Согласно MSDN

Если вы хотите ограничить совпадение, что он начинается с определенного положение символа в строке и механизм регулярных выражений не сканировать оставшуюся часть строки для сопоставить, привязать регулярное выражение с a\G (слева для a слева направо или справа для рисунка справа налево). Эта ограничивает совпадение, поэтому он должен начинаться точно при запуске.

Регулярное выражение совпадает со всей строкой, вам нужно будет использовать \G вместо ^

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

Ответ 2

Похоже, вы правы - вы путаетесь в значении ^. ^ означает самое начало линии, с которой вы работаете. ^bar будет соответствовать только строкам begin с "bar", которые вы сделали искусственно с помощью Substring. Мы могли бы помочь вам, если вы объясните, что вы пытаетесь с этим сделать.

Кстати, Substring должен быть значительно быстрее, чем большинство операций с регулярным выражением. Я был бы удивлен, если бы это убило вашу работу.