Я думал, что по умолчанию моего Regex будет проявлять жадное поведение, что я хочу, но это не в следующем коде:Regex ведет себя ленивым, должно быть жадным
Regex keywords = new Regex(@"in|int|into|internal|interface");
var targets = keywords.ToString().Split('|');
foreach (string t in targets)
{
Match match = keywords.Match(t);
Console.WriteLine("Matched {0,-9} with {1}", t, match.Value);
}
Выход:
Matched in with in
Matched int with in
Matched into with in
Matched internal with in
Matched interface with in
Теперь я понимаю, что я мог заставить его работать на этом маленьком примере, если я просто сортировал ключевые слова по длине по убыванию, но
- Я хочу понять, почему это не работает, как ожидалось, и
- фактический проект я работаю над имеет много больше слов в Regex и важно, чтобы держать их в алфавитном порядке.
Итак, мой вопрос: почему это лениво и как его исправить?
Я не уверен, что ваше фактическое использование является более сложным, но если приведенный выше пример - это то, что вы делаете, я думаю, что вы будете в тысячу раз лучше, зациклившись на вашем списке слов, ищущих совпадения с методом IndexOf , Если регулярное выражение просто содержит кучу слов в чередовании, производительность, вероятно, будет сосать. – Josh
@ Josh - Нет, пример упрощен. Фактическое приложение - это чтение языковых файлов для генерации лексеров и грамматических парсеров. Я просто немного ржавый в своих регулярных выражениях; моя проблема кажется такой очевидной сейчас! – Stomp
@Josh: Двигатели Regex могут делать много оптимизаций для таких случаев, включая отбрасывание многих проверок после отказа от общего префикса. Например, если первый символ не является «i», ни одна из ветвей, начинающихся с «i», не будет проверена. Не уверен, что движок .NET делает это, но я был бы удивлен, если бы это не так. –