Я хотел бы захватывать группы на основе последовательного появления совпадающих групп в любом порядке. И когда один тип набора повторяется без альтернативного типа набора, альтернативный набор возвращается как ноль.
Я пытаюсь извлечь имена и электронные письма на основе следующего регулярного выражения:
Для имен, два последовательных заглавных слова:
[A-Z][\w]+\s+[A-Z][\w]+
Для электронных писем:
\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}\b
Пример текста:
John Doe john@doe.com random text
Jane Doe random text jane@doe.com
jim@doe.com more random text tim@doe.com Tim Doe
До сих пор я использовал группы без захвата и позитивный взгляд впереди, чтобы решить проблему «нет определенного порядка или даже настоящего», но удалось это сделать только путем сегментирования по символам новой строки. Таким образом, мое регулярное выражение выглядит так:
^(?=(?:.*([A-Z][\w]+\s+[A-Z][\w]+))?)(?=(?:.*(\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}\b))?).*
И результаты пропускают элементы, в которых несколько контактов находятся в одной строке:
[
["John Doe", "john@doe.com"],
["Jane Doe", "jane@doe.com"],
["Tim Doe", "tim@doe.com"],
]
Когда я ищу следующее:
[
["John Doe", "john@doe.com"],
["Jane Doe", "jane@doe.com"],
[nil, "jim@doe.com"],
["Tim Doe", "tim@doe.com"],
]
Мои навыки в регулярных выражениях ограничены, и я начал использовать регулярные выражения, потому что это казалось лучшим инструментом для сопоставления имен и адресов электронной почты.
Является ли регулярное выражение лучшим инструментом для решения подобных задач или есть более эффективные альтернативы, использующие циклы, если мы извлекаем сотни контактов таким образом?