Регулярное выражение для соответствия n -ному вхождению и возврата части следующей строки строки - PullRequest
0 голосов
/ 19 марта 2020

Я использую Zapier для извлечения имен из тела письма, и мне нужно использовать Regex для возврата n-го вхождения имени в строке для каждого шага Zap.

Вот DEMO , с которым я работаю

Например, для 2-й части Zap, которую я хочу вернуть 'Джон Морлу, CPA, CFE, CIA, CMA , CGFM, PMP, CISA 'из строки.

Имена будут отличаться при каждом запуске Regex, поэтому Regex должен возвращать данные, которые находятся между каждым экземпляром' ....... .............................. 'and' ('

Пока у меня есть:

(? Mis) \ A (?:. ? ^. [] +) {2} (. ?) (? = [] * ()

, но я застрял

Как настроить код для возврата 1-го, 2-го или 3-го имени в списке?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 19 марта 2020

Если вам нужен только n-й матч (вместо списка совпадений для выбора n-го), он получает первое совпадение:

(?:\.{37}\s+.+?\(.*?){0}\.{37}\s+(.+?)\(

Это получает второе:

(?:\.{37}\s+.+?\(.*?){1}\.{37}\s+(.+?)\(

И третий:

(?:\.{37}\s+.+?\(.*?){2}\.{37}\s+(.+?)\(

Et c.

Основа c объяснение: - первая половина, начинающаяся с ?:, не является захватная группа; это должно соответствовать, но это не часть того, что захватывается. - {x} за ним заставляет его совпадать x раз, поэтому совпадать с первым, то есть 0 раз, со вторым 1 разом, et c. - остальное выражение снова совпадает с тем же, но теперь вам нужна группа 1.

Чтобы получить список для выбора:

\.{37}\s+(.+?)\(
0 голосов
/ 19 марта 2020

Чтобы получить информацию, представляющую интерес для 3 rd человека в списке, вы можете использовать следующее регулярное выражение:

(?:(?:^.*\s)*?\.{20}\.*\s+){3}\K.[^\)]*\)

Поскольку механизм регулярных выражений не был указан, я использовал PCRE (PHP).

Демонстрация

Я предположил, что разделительные линии периодов (37 в строке в примере) содержат как минимум 20 периодов.

Регулярное выражение выполняет следующие операции.

(?:             # begin a non-cap group
  (?:^.*\s)     # match entire line, incl. newline, in a non-cap group
  *?            # execute the non-cap group 0+ times, non-greedily
  \.{20}\.*\s+  # match entire line of 20+ periods, incl.
                #   the newline, followed by 0+ empty lines
)               # end the non-cap group
{3}             # execute the non-cap group 3 times
\K              # forget everything matched so far
[^\)]*          # match 0+ chars other than ')'
\)              # match ')'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...