Регулярное полностью совместимое с RFC 822 неэффективно и неясно из-за его длины. К счастью, RFC 822 был заменен дважды, а текущая спецификация адресов электронной почты - RFC 5322 . RFC 5322 приводит к регулярному выражению, которое можно понять, если его изучить в течение нескольких минут и достаточно эффективно для фактического использования.
Одно регулярное выражение, совместимое с RFC 5322, можно найти в верхней части страницы в http : //emailregex.com/ , но использует шаблон IP-адреса, который плавает по интернету, с ошибкой, которая позволяет 00
для любого из десятичных значений без знака в разделителе с точкой, что является незаконным. Остальная часть, по-видимому, согласуется с грамматикой RFC 5322 и проходит несколько тестов с использованием grep -Po
, включая имена доменов, IP-адреса, плохие и имена учетных записей с кавычками и без них.
Исправление 00
в шаблоне IP, мы получаем рабочее и довольно быстрое регулярное выражение. (Очистить визуализированную версию, а не уценку, для фактического кода.)
(?: [A-z0-9! # $% & Amp; '* + / =? ^ _ `{ |} ~ -] +:; | - * | "((\ [а-z0-9 # $% & амп '* + / = ^ _` {} ~] +?.!?): [\ x01- \ x08 \ x0b \ x0c \ x0e- \ x1f \ x21 \ x23- \ X5b \ x5d- \ x7f] | \\ [\ x01- \ x09 \ x0b \ x0c \ x0e- \ x7f]) * ") @ (? : (?: [а-z0-9] (: [а-z0-9 -] * [а-z0-9]) \?.) + [а-z0-9] (?: [а-z0 -9 -] * [а-z0-9]) |? \ [(:( :( 2 (5 [0-5?] | 1 [0-9 | [0-4] [0-9]) ] [0-9] | [1-9] [0-9])) \) {3} (:( 2 (5 [0-5] |?.? [0-4] [0-9]) | 1 [0-9] [0-9] | [1-9] [0-9]) | [а-z0-9 -] * [а-z0-9]:? (: [\ x01- \ x08 \ x0b \ x0c \ x0e- \ x1f \ x21- \ X5a \ x53- \ x7f] | \\ [\ x01- \ x09 \ x0b \ x0c \ x0e- \ x7f]) +) \])
Здесь диаграмма машины конечного состояния для вышеперечисленного регулярного выражения, которая более ясна, чем сама регулярная регрессия
Более сложные шаблоны в Perl и PCRE (библиотека регулярных выражений, например, на PHP) могут правильно разобрать RFC 5322 без заминки . Python и C # тоже могут это сделать, но они используют другой синтаксис из этих первых двух. Однако, если вы вынуждены использовать один из многих менее мощных языков сопоставления с образцами, тогда лучше всего использовать настоящий парсер.
Также важно понимать, что проверка его в RFC абсолютно ничего не говорит о том, действительно ли этот адрес существует в поставляемом домене, или является ли лицо, входящее в адрес, его истинным владельцем. Люди подписывают других до списков рассылки таким образом все время. Фиксирование, требующее более любезной проверки, которая включает отправку этого адреса, сообщение, которое включает токен подтверждения, предназначенный для ввода на той же веб-странице, что и адрес.
Подтверждающие жетоны - единственный способ узнать, что вы получили адрес человека, входящего в него. Вот почему большинство списков рассылки теперь используют этот механизм для подтверждения регистрации. В конце концов, любой может подавить
president@whitehouse.gov
, и это будет даже разоблачать как законное, но вряд ли это будет на другом конце.Для PHP вы должны не используйте шаблон, указанный в . Подтвердите адрес электронной почты с помощью PHP, правильный путь , из которого я цитирую:
Существует некоторая опасность того, что общее использование и широкое небрежное кодирование установит фактический стандарт для адресов электронной почты, который является более ограничительным, чем записанный формальный стандарт.
Это не лучше, чем все другие шаблоны, отличные от RFC. Он даже не достаточно умен, чтобы обрабатывать даже RFC 822 , не говоря уже о RFC 5322. Однако это .
Если вы хотите получить фантазию и педантичность, реализовать полный механизм состояния . Регулярное выражение может действовать только как элементарный фильтр. Проблема с регулярными выражениями заключается в том, что кто-то говорит, что их совершенно корректный адрес электронной почты недействителен (ложный положительный результат), потому что ваше регулярное выражение не может справиться с этим, это просто грубо и невежливо с точки зрения пользователя. Механизм состояния для этой цели может как проверять, так и даже исправлять адреса электронной почты, которые в противном случае считались бы недействительными, поскольку он разбирает адрес электронной почты в соответствии с каждым RFC. Это позволяет потенциально более приятный опыт, например
Указанный адрес электронной почты 'myemail @ address, com' недействителен. Вы имели в виду «myemail@address.com»?
См. Также Проверка адресов электронной почты , включая комментарии. Или Сравнение адреса электронной почты Проверка регулярных выражений .
Вы можете использовать пакет xts, который позаботится о вас для деталей (например, даже если серия имеет пробел)
library(xts)
ts1<-as.xts(ts(c(1:12),star=c(2014,1),freq=12))
ts2<-as.xts(ts(c(13:24),star=c(2015,1),freq=12))
str(ts3 <- c(ts1, ts2))
# An ‘xts’ object on Jan 2014/Dec 2015 containing:
# Data: int [1:24, 1] 1 2 3 4 5 6 7 8 9 10 ...
# Indexed by objects of class: [yearmon] TZ:
# xts Attributes:
# NULL
Cheers, Peter
Вам нужно переназначить атрибуты из первой серии.
> ts(c(ts1,ts2), start=start(ts1), frequency=frequency(ts1))
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2014 1 2 3 4 5 6 7 8 9 10 11 12
2015 13 14 15 16 17 18 19 20 21 22 23 24
Я думаю, что вы ищете что-то вроде
comb <- ts.union(ts1, ts2)
pmin(comb[,1], comb[,2], na.rm = TRUE)
# Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
#2014 1 2 3 4 5 6 7 8 9 10 11 12
#2015 13 14 15 16 17 18 19 20 21 22 23 24
Это сработало для меня
ts.union(ts1, ts2)
ts1 ts2
Jan 2014 1 NA
Feb 2014 2 NA
Mar 2014 3 NA
Apr 2014 4 NA
May 2014 5 NA
Jun 2014 6 NA
Jul 2014 7 NA
Aug 2014 8 NA
Sep 2014 9 NA
Oct 2014 10 NA
Nov 2014 11 NA
Dec 2014 12 NA
Jan 2015 NA 13
Feb 2015 NA 14
Mar 2015 NA 15
Apr 2015 NA 16
May 2015 NA 17
Jun 2015 NA 18
Jul 2015 NA 19
Aug 2015 NA 20
Sep 2015 NA 21
Oct 2015 NA 22
Nov 2015 NA 23
Dec 2015 NA 24