Regex: найти строку между фигурными скобками, которая сама содержит фигурные скобки - PullRequest
1 голос
/ 15 октября 2019

Предположим, строка в следующем формате:

Use \hyperlink{aaa}{apple {pear} banana} and \hyperlink{bbb}{banana {pear} {apple}}.

Я хочу извлечь:

\hyperlink{aaa}{apple {pear} banana}
\hyperlink{bbb}{banana {pear} {apple}}

Какой регулярное выражение может быть использовано для такого извлечения?

Я застрял с этим:

\\hyperlink{\S+}{.+}

Ответы [ 2 ]

2 голосов
/ 15 октября 2019

Если нет произвольного вложения, вы можете использовать шаблон с отрицание }{ как

\\hyperlink{[^}{]*}{[^}{]*(?:{[^}{]*}[^}{]*)*}

Подобный этот ответ , но развернутый. Смотрите демо-версию на regex101 . Для { извлечения } используйте группы ( демо ).

В зависимости от вашего окружения / вкуса регулярных выражений может потребоваться выход из отверстия {обратной косой чертой для фигурных скобок, которые не находятся внутри класса символов, чтобы буквально соответствовать им.

Также обратите внимание, что \S+ может потреблять }, а .+ может соответствовать больше, чем нужно если не в курсе.

1 голос
/ 16 октября 2019

Вот как вы можете сделать это с помощью рекурсивного регулярного выражения

\\hyperlink\{[^}]+?\}(\{(?>[^{}]+|(?1))+\})(?=\s|$)

Regex Demo

Recursive regex

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...