Как сопоставить регулярное выражение еще менее жадным, чем не-жадным? - PullRequest
0 голосов
/ 18 июня 2020

В этом вопросе основное внимание уделяется pcre -регулярному выражению, используемому grep -P.

Представьте, что у меня есть строка abcRabcSxyxz и я ищу подстроку, которая начинается с abc и заканчивается на x, но с ограничением, что никакая более короткая подстрока этого совпадения также не будет соответствовать.

Моя первая попытка была не жадным регулярным выражением,

grep -Po 'abc.*?x' <<<abcRabcSxyxz

, но это возвращает abcRabcSx , а я хотел бы найти только abcSx . Очевидно, почему даже моя не жадная попытка все же дает слишком долгое совпадение; Мне нужен движок регулярных выражений, чтобы постараться. Моя вторая попытка была

grep -Po '(?>abc.*?)x' <<<abcRabcSxyxz

, которая вообще не дала совпадения (возможно, я действительно не понимаю использование ($?...) объяснено здесь ).

Любое простое решение моей проблемы?

ОБНОВЛЕНИЕ Я вижу из комментариев, что мой пример не совсем точно объясняет, что я ищу, поэтому здесь более общий описание:

Я ищу совпадения в форме PXQ, где P, X и Q являются произвольными шаблонами, а X должен не содержать совпадение с P. Плюс, я не 'Не хочу буквально повторно вводить шаблон P внутри X.

Например,

`[(][^(]*[)]`

было бы возможным (но не удовлетворяющим) решением для конкретного случая, в котором я ищу заключенный в скобки выражение, которое не содержит других скобок (здесь P - [(], X - произвольная строка, а Q - [)]), но даже этот пример показывает, что я должен буквально повторить содержащуюся информацию в P при указании средней части ([^ (] *), чтобы убедиться, что мой P там не содержится). Я ищу способ, который избавит от необходимости в этом явном повторении.

...