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
должен быть значительно быстрее, чем большинство операций с регулярным выражением. Я был бы удивлен, если бы это убило вашу работу.