Регулярка, объясните

  • Автор темы Автор темы backoff
  • Дата начала Дата начала

backoff

Client
Регистрация
20.04.2015
Сообщения
6 357
Реакции
6 655
Баллы
113
ку
дано

C#:
Развернуть Свернуть Копировать
"status":"SUCCESS","pricing":{"nrw":{"registration":"35.04","renewal":"35.58","transfer":"35.58"

надо взять только - nrw

делаю так
C#:
Развернуть Свернуть Копировать
(?<=").*?(?=":\{"registration)

берет так
C#:
Развернуть Свернуть Копировать
status":"SUCCESS","pricing":{"nrw

почему?

по идее же (?<=").*?(?=":\{"registration)
знак вопроса и говорит что надо брать самое короткое совпадение между " и ":{"registration
а самое короткое и есть то что мне надо

где косяк?

79755
 
Да. Тоже заметил такую "особенность регулярок".
Место *? можно указать .{1,5} например
 
если бы регулярки искали все возможные вхождения, а потом среди них выбирало кратчайшее, представляешь насколько бы выросла нагрузка?

регулярка ищет первое удовлетворяющее условие и уже там пытается сократить результат. Она не будет искать новое значение и сравнивать их длины
 
  • Спасибо
Реакции: backoff и Mikhail B.
если бы регулярки искали все возможные вхождения, а потом среди них выбирало кратчайшее, представляешь насколько бы выросла нагрузка?

регулярка ищет первое удовлетворяющее условие и уже там пытается сократить результат. Она не будет искать новое значение и сравнивать их длины
А самой регуляркой можно поставить условие для сокращения? (помимо моего варианта)
 
если бы регулярки искали все возможные вхождения, а потом среди них выбирало кратчайшее, представляешь насколько бы выросла нагрузка?

регулярка ищет первое удовлетворяющее условие и уже там пытается сократить результат. Она не будет искать новое значение и сравнивать их длины
логично
 
знак вопроса и говорит что надо брать самое короткое совпадение между " и ":{"registration
Искать самое короткое совпадение между первых встреченных ", и до ":\{"registration

Используй такую регулярку, будет то что нужно
Код:
Развернуть Свернуть Копировать
(?<=")[^"]*?(?=":\{"registration)
 
  • Спасибо
Реакции: Mikhail B. и backoff
Искать самое короткое совпадение между первых встреченных ", и до ":\{"registration

Используй такую регулярку, будет то что нужно
Код:
Развернуть Свернуть Копировать
(?<=")[^"]*?(?=":\{"registration)
знак вопроса лишний
 
Код:
Развернуть Свернуть Копировать
(?<=")[^"]*?(?=":\{"registration)
(?<=") - искать любые символы после "
[^"] - кроме "
* - символов может быть 0 или больше (можно использовать + символов может быть 1 или больше)
? - самое короткое совпадение (не обязателен в данной регулярке)
(?=":\{"registration) - конец поиска
 
Снова прошу разъяснить, чето не получается

есть строка
C#:
Развернуть Свернуть Копировать
C:\ZennoPoster\projects\Yandex\YandexReger2\data\profiles\elkngdfjg.zpprofile
нужно получить - elkngdfjg

делаю так
C#:
Развернуть Свернуть Копировать
(?<=\\)[^\\].*?(?=\.zpprofile)
получаю
C#:
Развернуть Свернуть Копировать
ZennoPoster\projects\Yandex\YandexReger2\data\profiles\elkngdfjg
пробовал так
81720
получаю либо тоже самое либо ошибку по синтаксису (потому что надо закрывать \\)

как выделить?
 
есть строка
C#:
Развернуть Свернуть Копировать
C:\ZennoPoster\projects\Yandex\YandexReger2\data\profiles\elkngdfjg.zpprofile
нужно получить - elkngdfjg
C#:
Развернуть Свернуть Копировать
return Path.GetFileNameWithoutExtension(@"C:\ZennoPoster\projects\Yandex\YandexReger2\data\profiles\elkngdfjg.zpprofile");
 
  • Спасибо
Реакции: backoff
давно это заметил не вариант как то сделать что бы самое короткое выражение работало по принципу.
ищем на то что заканчивается выражение и берет первое попавчееся выражение слевой стороны. вообще не удобно сделано
 
ну это вопрос не к разрабам зенки, а к разрабам регулярок как мне кажется
зенка просто работает по "законам" регулярок без какой-то самодеятельности, что в целом и правильно
 
давно это заметил не вариант как то сделать что бы самое короткое выражение работало по принципу.
ищем на то что заканчивается выражение и берет первое попавчееся выражение слевой стороны. вообще не удобно сделано
ну это вопрос не к разрабам зенки, а к разрабам регулярок как мне кажется
зенка просто работает по "законам" регулярок без какой-то самодеятельности, что в целом и правильно
Направление поиска можно поменять как здесь описано:

C#:
Развернуть Свернуть Копировать
string pattern = @"(?<=\\).*?(?=\.zpprofile)";
//Regex reg = new Regex(pattern);
Regex reg = new Regex(pattern, RegexOptions.RightToLeft);
string instring = @"C:\ZennoPoster\projects\Yandex\YandexReger2\data\profiles\elkngdfjg.zpprofile";
project.Variables["testregex"].Value = reg.Match(instring).Value;

81804
 
Последнее редактирование:
  • Спасибо
Реакции: Sergodjan

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