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




(2)

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

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: Успех: правда

?

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

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

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


По данным MSDN

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

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

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


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

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





regex