Как эффективный способ найти шаблон в большом тексте? - PullRequest
3 голосов
/ 12 мая 2010

Я хочу извлечь адреса электронной почты из большого текстового файла. какой лучший способ сделать это?

Моя идея состоит в том, чтобы найти '@' в тексте и использовать «Regex», чтобы найти адрес электронной почты в подстроке в (например) 256 символов до этой позиции и длины 512.

P.S .: Просто хочу узнать, как лучше и эффективнее найти шаблон (например, адреса электронной почты) в огромном тексте.

Ответы [ 4 ]

1 голос
/ 12 мая 2010

Если вам абсолютно нужен самый эффективный способ, я не думаю, что следует использовать регулярные выражения.

Предполагая, что почти все экземпляры @ в вашем тексте являются адресами электронной почты, и вы работаете на языке с ускоренной перемоткой вперед и назад, этот метод, вероятно, будет близок к быстрейшему:

  1. Поиск @
  2. Вручную сравнить каждый символ после @, чтобы убедиться, что он находится в допустимых диапазонах ASCII
  3. Отслеживать, был ли найден действительный домен перед первым пробелом или другим допустимым завершающим символом
  4. Поиск снова от символа @ в обратном направлении, сравнивая каждый символ, чтобы убедиться, что он попадает в допустимые диапазоны символов для локального компонента
1 голос
/ 12 мая 2010

Это зависит от того, сколько ложных срабатываний и ложных отрицаний вы хотите. Адреса электронной почты, как правило, состоят из букв, цифр и определенных символов. Однако, хотя, вероятно, крайне редко можно увидеть символы из этого набора на реальном адресе электронной почты, стандарт , безусловно, позволяет это . Поэтому вам действительно нужно решить, сколько реальных совпадений вы хотите и сколько совпадений вы хотите, которые соответствуют вашему регулярному выражению, но не являются адресами электронной почты.

Вот один ответ, исключающий множество допустимых случаев, а также, вероятно, слишком много:

[A-Za-z0-9!#$%&*+-=?^_~]{1,64}@[A-Za-z0-9-.]{1,255}\.[A-Z]{2,6}
1 голос
/ 12 мая 2010

256 и 512 звучат как произвольные значения.

  • Вы действительно можете найти знак @, но тогда вам придется читать вперед и назад, пока не встретишь символ, который не допускается в адрес электронной почты (например, другой @ знак, пробел, обратный слеш ...)
  • Цитирование википедии:

Локальная часть адреса электронной почты может быть длиной до 64 символов и доменное имя может иметь максимум 255 символов.

Так что эти значения будут лучше.

Теперь объедините оба метода и вуаля, у вас есть свой алгоритм.

0 голосов
/ 12 мая 2010

Найти все действительные адреса электронной почты непросто, поскольку RFC для синтаксиса адресов электронной почты довольно сложен . Если вы просто хотите найти нормальные адреса электронной почты, вы можете использовать что-то вроде:

/(?<=^|[\s<(\["'])[a-z][\w.+-]+@[\w-]+(?:\.[\w-]+)+(?=[>)\]"']|$)/gi

Это регулярное выражение предполагает, что:

  • Адрес электронной почты начинается с буквы и содержит только буквенно-цифровые символы, точку, знак подчеркивания и дефис (и, конечно, один @). Это позволяет + в названии части.
  • Они заключены в пробелы, квадратные скобки, круглые скобки, одинарные / двойные кавычки или угловые скобки

Он не проверяет, находятся ли длины части имени и домена в пределах их допустимого диапазона (и многих других ограничений, установленных RFC). Протестируйте его на примере файла и посмотрите, сколько писем соответствует.

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