[ID CC-CC2021] Почему не работает ленивый квантификатор?

afalbert

Топикстартер
10 лет на форуме
Сообщения
120
Реакции
88
Добрый день!
пытаюсь с помощью греп-стиля выделить содержимое последних скобок в абзаце.
а он выделяет все :(

Снимок экрана 2019-09-16 в 20.02.02.png


как выделить только последнюю?
 

afalbert

Топикстартер
10 лет на форуме
Сообщения
120
Реакции
88
Это работает, большое спасибо, но почему не работает мое выражение? хочется понять
 

veretragna

γνώσις
Сообщения
578
Реакции
199
[^(]+\) - негативный поиск, дословно "искать любую последовательность символов, не являющихся скобкой, до закрывающей скобки"
Этот метод хорош.
А чтобы ваше выражение заработало, нужно поменять + на *.
2019-09-16_210553.png
 

veretragna

γνώσις
Сообщения
578
Реакции
199
Был неправ, мой вариант регулярки захватывает больше положенного. Вариант товарища lev лучше.
 

@diz@

отечеств. про
15 лет на форуме
Сообщения
4 220
Реакции
1 914
Если после последней скобки стоит, например, точка - не заработает.
 

veretragna

γνώσις
Сообщения
578
Реакции
199
Под частности можно написать условие "1 символ или ничего", типа \.?.
 
Последнее редактирование:

afalbert

Топикстартер
10 лет на форуме
Сообщения
120
Реакции
88
Вариант товарища lev меня полностью устроил, и я даже, кажется, понял почему не правильно моё выражение :)
 

veretragna

γνώσις
Сообщения
578
Реакции
199
Квантификатор осуществляет поиск от первого символа до конца строки; то есть он нашел самую первую скобку в предложении и идет до самого конца строки, а затем начинает поиск в обратную сторону, пока не найдет вторую скобку. Таким образом он всегда будет захватывать максимальное количество символов.
Вариант товарища lev действует иначе - он ищет четкий паттерн первая скобка - последовательность не-скобок - вторая скобка - конец строки. Когда он находит искомую последовательность, он тупо останавливается и ничего больше не ищет. Лишние фрагменты не попадают в выборку, поскольку прямо за ними нет символа конца строки.
Лепота
 

afalbert

Топикстартер
10 лет на форуме
Сообщения
120
Реакции
88
если бы в выражении после скобки не было бы конца абзаца, "ленивый" квантификатор нашел бы вторую скобку и остановился бы. т.е. захватил бы минимальное кол-во символов. Но в моем выражении, он останавливается только когда находит скобку и конец абзаца, т.е. захватывает и все остальные скобки тоже
 

veretragna

γνώσις
Сообщения
578
Реакции
199
Да, так и есть. Я, наверное, зря расширил логический пример до самого большого охвата, это "жадный" квантификатор проходит до самого конца. Вы правы, ленивый остановится на ближайшей скобке.
Но логика у него внутри примерно та же, что и у жадного - в поисках символа конца строки он проходит до самого конца, включая в выборку все фрагменты в скобках.
 
Последнее редактирование: