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

backoff

Client
Регистрация
20.04.2015
Сообщения
6 054
Благодарностей
6 482
Баллы
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
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 418
Благодарностей
5 454
Баллы
113
Да. Тоже заметил такую "особенность регулярок".
Место *? можно указать .{1,5} например
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
если бы регулярки искали все возможные вхождения, а потом среди них выбирало кратчайшее, представляешь насколько бы выросла нагрузка?

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

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 418
Благодарностей
5 454
Баллы
113
если бы регулярки искали все возможные вхождения, а потом среди них выбирало кратчайшее, представляешь насколько бы выросла нагрузка?

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

backoff

Client
Регистрация
20.04.2015
Сообщения
6 054
Благодарностей
6 482
Баллы
113
если бы регулярки искали все возможные вхождения, а потом среди них выбирало кратчайшее, представляешь насколько бы выросла нагрузка?

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

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 418
Благодарностей
5 454
Баллы
113

porileenvej

Client
Регистрация
09.05.2020
Сообщения
99
Благодарностей
131
Баллы
33
знак вопроса и говорит что надо брать самое короткое совпадение между " и ":{"registration
Искать самое короткое совпадение между первых встреченных ", и до ":\{"registration

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

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Искать самое короткое совпадение между первых встреченных ", и до ":\{"registration

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

backoff

Client
Регистрация
20.04.2015
Сообщения
6 054
Благодарностей
6 482
Баллы
113

porileenvej

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

backoff

Client
Регистрация
20.04.2015
Сообщения
6 054
Благодарностей
6 482
Баллы
113

backoff

Client
Регистрация
20.04.2015
Сообщения
6 054
Благодарностей
6 482
Баллы
113
Снова прошу разъяснить, чето не получается

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

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

как выделить?
 

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
745
Баллы
113

backoff

Client
Регистрация
20.04.2015
Сообщения
6 054
Благодарностей
6 482
Баллы
113
не, тут весь прикол, использовать только "\"
с дополнительными параметрами легко сделать
 
  • Спасибо
Реакции: Roman48

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
745
Баллы
113

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
745
Баллы
113

Reysh

Client
Регистрация
02.12.2018
Сообщения
198
Благодарностей
133
Баллы
43

volody00

Client
Регистрация
06.09.2016
Сообщения
918
Благодарностей
953
Баллы
93

backoff

Client
Регистрация
20.04.2015
Сообщения
6 054
Благодарностей
6 482
Баллы
113

volody00

Client
Регистрация
06.09.2016
Сообщения
918
Благодарностей
953
Баллы
93

backoff

Client
Регистрация
20.04.2015
Сообщения
6 054
Благодарностей
6 482
Баллы
113

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 423
Благодарностей
9 123
Баллы
113
  • Спасибо
Реакции: backoff

heks

Client
Регистрация
01.10.2013
Сообщения
1 204
Благодарностей
316
Баллы
83
давно это заметил не вариант как то сделать что бы самое короткое выражение работало по принципу.
ищем на то что заканчивается выражение и берет первое попавчееся выражение слевой стороны. вообще не удобно сделано
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 054
Благодарностей
6 482
Баллы
113
ну это вопрос не к разрабам зенки, а к разрабам регулярок как мне кажется
зенка просто работает по "законам" регулярок без какой-то самодеятельности, что в целом и правильно
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 423
Благодарностей
9 123
Баллы
113
давно это заметил не вариант как то сделать что бы самое короткое выражение работало по принципу.
ищем на то что заканчивается выражение и берет первое попавчееся выражение слевой стороны. вообще не удобно сделано
ну это вопрос не к разрабам зенки, а к разрабам регулярок как мне кажется
зенка просто работает по "законам" регулярок без какой-то самодеятельности, что в целом и правильно
Направление поиска можно поменять как здесь описано:

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
 
Последнее редактирование:

backoff

Client
Регистрация
20.04.2015
Сообщения
6 054
Благодарностей
6 482
Баллы
113
  • Спасибо
Реакции: Sergodjan

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