Не предсказуемая логика регекс на самое короткое совпадение - пример

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 955
Благодарностей
781
Баллы
113
есть код:
C#:
string pattern = @"(?<=:).*?(?=$)";
Regex reg = new Regex(pattern);
string instring = "socks5://123.0.2.1:0000@login:pass";
project.Variables["testregex"].Value = reg.Match(instring).Value;
предполагалось, что должно взять "pass", но берёт "//123.0.2.1:0000@login:pass"
и нет разницы - стоит самое короткое совпадение
C#:
@"(?<=:).*?(?=$)"
или нет
C#:
@"(?<=:).*(?=$)"
понятно что решить это можно составив новый регекс -
C#:
@"(?<=:)[^:]*?(?=$)"
, не в этом проблема
проблема в понимании, почему не всегда работает самое короткое совпадение, или это зенно проглючило, или так работает самое короткое совпадение?
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 694
Баллы
113
насколько я понял, самое короткое работает при выборе из нескольких вариантов, а тут всегда один вариант. вот если разделить пробелом или преносом, тогда он будет выбирать, а в сплошном тексте хватает что первое попалось.
 
  • Спасибо
Реакции: arhip1985

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 955
Благодарностей
781
Баллы
113
Спасибо. теперь понятно, в данном случае будет находить правильно, если добавить режим
Regex reg = new Regex(pattern, RegexOptions.RightToLeft);
 
  • Спасибо
Реакции: nicanil

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)