2013-08-21 2 views
0

У меня есть дамп данных для работы в текстовых файлах Я хочу извлечь содержимое писем с помощью регулярных выражений.Regex Email и дата

На данный момент я пытаюсь удалить исходный запрашивающего из данных оригинальный Creater сообщения электронной почты всегда будет иметь временную метку от своего имени, но тех, кто не будет адрес присутствовал в cc

По существу электронная почта выглядеть следующим образом

Джон Смит (XYZ RE) (M/DD/YYYY HH: MM PM):

формат электронной почты Джона Смита (XYZ RE) появится снова далее вниз по электронной почте с различными люди

Я создал это безвкусное регулярное выражение, чтобы получить электронную почту (он работает так им достаточно счастлив с ним, и я понимаю, что более важно)

([^\s]+\s+[^\s]+\s+[(]+[A-Z]+\s+[A-Z]+[)]) 

Я также пытался что-то похоже, чтобы извлечь дату, но это работает некоторые даты и падения с другими

([^\s][0-9]+[/]+[0-9]+[/]+[0-9]+\s+[0-9][:][0-9]+\s+(AM|PM)[)][:]) 

Может ли кто-нибудь помочь?

Im совершенно новое в Regex и хотел бы прогуляться через тоже, если у вас есть время Im с помощью Notepad ++, чтобы проверить его, а затем с помощью приложения на основе Java, чтобы запустить его

Благодаря Джон

+1

Ваше время имеет только одну цифру «час», для одного ... (на самом деле, повторное чтение, это может быть вашей проблемой - любая дата с 2-значным часовым полем не будет соответствовать) – Michelle

ответ

3

Вы не нужны все эти квадратные скобки, достаточно использовать классы символов.

Для даты/время регулярного выражения, использовать что-то вроде:

'\(\d+\/\d+\/\d+\s\d+:\d+ (AM|PM)\):' 

\d похож на [0-9] - короче :)

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

Имея что-то в шаблоне регулярного выражения, окруженном скобками, () будет означать, что все, что согласовано в этих скобках, будет «захвачено» (хранится в переменных для последующего использования). Если вы работаете с большими текстами, и не нужно, чтобы получить доступ совпавшие строки (например, только замена или что-то), то вы можете избежать захвата, добавив ?: в своих скобках, например:

'\(\d+\/\d+\/\d+\s\d+:\d+ (?:AM|PM)\):' 
          ^^ 

это не будет хранить совпавшие буквы AM или PM в переменной, что означает немного лучшую производительность для больших текстов :)

+1

Небольшая опечатка (у вас есть избыток ':'): '\ (\ d + \/\ d + \/\ d + \ d +: \ d + (AM | PM) \):' – zessx

+0

исправил ее. Я привык к временам с секундами в качестве их последнего элемента;) – mavili

+1

Плюс, я бы избежал группы AM/PM, используя '(?: AM | PM)'. Во всяком случае, это был хороший ответ. +1 – zessx

1

Вы просто не хватает одного +, судя по ним, которые будут ограничивать свои матчи до даты с однозначное поле часа.

([^\s][0-9]+[/]+[0-9]+[/]+[0-9]+\s+[0-9]+[:][0-9]+\s+(AM|PM)[)][:]) 
             ^

Вы можете упростить регулярное выражение, заменив [^\s] с \S и [0-9] с \d, но так как это звучит, как использовать один-времени, что вы найдете легче читать, вероятно, более уместно. Ни одна из этих замен не нужна, они просто ярлыки.

(Кроме того, вместо того, чтобы захватить «AM» или «PM», вы могли бы заменить (AM|PM) с [AP]M, который совпадает с А или Р с последующими М без захвата группы.)

0

Для вашей даты попытки используя это: /^(1[0-2]|0[1-9])\/(3[01]|[12][0-9]|0[1-9])\/[0-9]{4} ([0-2][0-9]\:[0-5][0-9]) (AM|PM)$/