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

afalbert

Участник
Топикстартер
Сообщения
92
Реакции
77
Добрый день!
пытаюсь с помощью греп-стиля выделить содержимое последних скобок в абзаце.
а он выделяет все :(

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


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

afalbert

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

veretragna

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

veretragna

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

@diz@

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

veretragna

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

afalbert

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

veretragna

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

afalbert

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

veretragna

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