Как захватить текст с обеих сторон шаблона в именованную группу захвата? - PullRequest
0 голосов
/ 30 октября 2019

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

  • ... INFO [пример] ...
  • ... SEVERE [пример] ...
  • ... [пример] ОШИБКА ...
  • ... [пример] WARN ...

Поначалу казалось, что решить простую проблему, но я до сих пор не смог найти решение. Любая помощь будет оценена.

Спасибо.

1 Ответ

0 голосов
/ 30 октября 2019

Какой язык / реализацию / среду выполнения вы используете?

PCRE включает несколько именованных групп захвата с помощью модификатора режима (?J) , но во многих реализациях (включая Perl) вы можетене используйте дублированные группы захвата , если они не являются частью отдельных альтернатив регулярному выражению.

т.е. в Perl и PHP: совпадение для следующего будет невозможно при попытке сопоставления "... ERROR":

/(?J)(?<type>INFO)?.*?(?<type>ERROR)?/

Это потому, что первая группа захвата "выигрывает" и остается пустой. (См. Ниже)

Однако ...

/(?J)(?<type>INFO|SEVERE)\b.*|.*\b(?<type>ERROR|WARN)/ будет работать

Я не совсем понялто, что вы пытались сопоставить, поэтому я не уверен, что вышеприведенные регулярные выражения каким-либо образом отражают то, что вы делаетеhttps://www.regular -expressions.info / named.html

... В Perl обратная ссылка сопоставляет текст, захваченный самой левой группой в регулярном выражении, с тем именем, которое соответствует чему-то .. .

Таким образом, в Perl и Ruby вы можете только осмысленно использовать группы с одинаковыми именами, если они находятся в отдельных альтернативах в регулярном выражении, так что только одна из групп с таким именем может когда-либо захватывать любой текст. Затем обратные ссылки на эту группу разумно соответствуют тексту, захваченному группой.

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