Возврат только одной группы с условием ИЛИ в регулярном выражении
Я должен написать регулярное выражение для получения адреса электронной почты из предложения. Я хочу, чтобы он был возвращен только для группы 1.
Regex:
\[mailto:(.+)\]|<(.+@.+\..+)>
Строка ввода:
Hello my Email Address is <foo@hotmail.com> - Return foo@hotmail.com as Group1.
Hello my Email Address is [mailto: foo@hotmail.com] - Return foo@hotmail.com as Group2.
Я хочу, если какая-либо строка соответствует, то она должна быть возвращена в Group1.
Есть какой-либо способ сделать это?
2 ответа
Решение
Вы можете использовать регулярное выражение:
(?=\S+@)([^<\s]+@.*(?=[>\]]))
(?=\S+@)
Позитивный взгляд, утверждаю, что то, что следует, это любые непробельные символы, сопровождаемые@
,([^<\s]+@.*(?=[>\]]))
Захват группы. Захватить любой не пробел, не^
за персонажем следует@
и что угодно до]
или же>
персонаж.
Вы можете проверить регулярное выражение здесь.
Вы можете сначала сопоставить любой из них и утверждать, что он заканчивается на..>
или сопоставить[mailto:
и утверждать, что оно заканчивается
Чтобы предотвратить ненужный возврат и предотвратить чрезмерное сопоставление, вы можете использовать отрицательный класс символов , обозначаемый[^
(?:<(?=[^<>]*>)|\[mailto:\s*(?=[^][]*]))([^\s@]+@[^\s@]+\.\w{2,})
Узор соответствует:
-
(?:
Группа без захвата для альтернатив-
<(?=[^<>]*>)
Сопоставить и утверждать...>
без какого-либо возникновения<
или>
между -
|
Или -
\[mailto:\s*
соответствовать[mailto:
за которым следуют необязательные пробелы -
(?=[^][]*])
Позитивный просмотр вперед, утверждает соответствие необязательных символов, отличных от[
или и сопоставить]
-
- Закройте группу без захвата
-
(
Группа захвата 1-
[^\s@]+
Соответствует 1+ символам, кроме @ или символа пробела. -
@
Сопоставьте @ -
[^\s@]+\.\w{2,}
Сопоставьте 1+ символов, кроме @ или символа пробела, за которым следует точка, и 2 или более символов слова (вы можете сделать TLD настолько конкретным, насколько хотите).
-
-
)
Закрыть группу 1
Посмотреть демонстрацию регулярных выражений