Все сводится к здравому смыслу. Если то, что вы пытаетесь сопоставить, становится неуправляемым регулярным выражением монстра, то вам нужно либо разбить его на небольшие логические субрегулярные выражения, либо начать переосмысливать свое решение.
Возьмите адреса электронной почты (согласно вашему примеру). Это простое регулярное выражение (взятое из друзей RegEx) соответствует 99% всех электронных писем:
\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b
Это коротко и точно, и вы редко будете сталкиваться с проблемами с ним. Однако, как отмечает автор сообщения RegEx, если ваш адрес электронной почты находится в редком домене верхнего уровня ".museum", он не будет принят.
Чтобы правильно сопоставить все адреса электронной почты, необходимо придерживаться стандарта, известного как RFC 2822 . В нем описывается множество способов форматирования адресов электронной почты, и это чрезвычайно сложно.
Вот пример регулярного выражения, пытающегося придерживаться RFC 2822:
(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"
(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x
0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9]
(?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.)
{3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08
\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
Это, очевидно, становится проблемой уменьшения прибыли. Лучше использовать легко поддерживаемую реализацию, которая соответствует 99% адресов электронной почты, а не монструозной, которая принимает 99,9% из них.
Регулярные выражения - отличный инструмент для ваших инструментов программистов, но они не являются решением всех ваших проблем с анализом. Если вы обнаружите, что ваше решение RegEx начинает становиться чрезвычайно сложным, вам нужно либо попытаться логически разбить его на более мелкие регулярные выражения для соответствия частям вашего текста, либо вам нужно начать искать другие методы для решения вашей проблемы. Точно так же есть просто проблемы, которые Регулярные выражения, в силу их природы, не могут решить (как сказал один из авторов, не придерживаясь Regular Language ).