正则表达式 – 苏demo的别样人生 https://www.libaocai.com 行走于凡尘俗世,活得别样人生 Thu, 13 Aug 2015 09:14:07 +0000 zh-CN hourly 1 https://wordpress.org/?v=6.2.4 史上最复杂的验证邮件地址的正则表达式 https://www.libaocai.com/3890.html https://www.libaocai.com/3890.html#respond Thu, 13 Aug 2015 09:14:07 +0000 http://www.libaocai.com/?p=3890 用正则表达式验证邮件地址似乎是一件简单的事情,但是如果要完美的验证一个合规的邮件地址,其实也许很复杂。

NrUFNza

邮件地址的规范来自于 RFC 5322 。有一个网站 emailregex.com 专门列出各种编程语言下的验证邮件地址的正则表达式,其中很多正则表达式都是我听说过而从未见过的复杂——我想说,做这个网站的程序员是被邮件验证这件事伤害了多深啊!

其实,在产品环境中,一般来说并不需要这么复杂的正则表达式来做到99.99%正确。一般来说,从执行效率和测试覆盖率来说,只需要一个简单的版本即可:

/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i

那么下面我们来看看这些更严谨、更复杂的正则表达式吧:

验证邮件地址的通用正则表达式(符合 RFC 5322 标准)

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\

\[\x01-\x09\x0b\x0c\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])+)\]

)

由于各种语言对正则表达式的支持不同、语法差异和覆盖率不同,所以,不同语言里面的正则表达式也不同:

Python

这个是个简单的版本:

r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)"

Javascript

这个有点复杂了:

/^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+)*\.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i

Swift

[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}

PHP

PHP 的这个版本就更复杂了,覆盖率就更大一些:

/^(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){255,})(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){65,}@)(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22))(?:\.(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-[a-z0-9]+)*\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-[a-z0-9]+)*)|(?:

\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\]

]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))

\())$/iD

Perl / Ruby

?? PHP ????Perl ? Ruby ???????????

(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\)

! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\] ]))|”(?:[^\”\r\ \(|\\.|(?:(?:\r\n)?[ \t]))*”(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\] ]))|”(?:[^\”\r\ \(|\\.|(?:(?:\r\n)?[\t]))*”(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\]

]))|

\[([^\]

! \(\r\\) |\\.)* \((?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\]

]))|

\[([^\]

! \(\r\\) |\\.)* \((?:(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\] ]))|”(?:[^\”\r\ \(|\\.|(?:(?:\r\n)?[ \t]))*”(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\]

]))|

\[([^\]

! \(\r\\) |\\.)* \((?:(?:\r\n)?[\t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\]

]))|

\[([^\]

! \(\r\\) |\\.)* \((?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[\t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\]

]))|

\[([^\]

! \(\r\\) |\\.)* \((?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\]

]))|

\[([^\]

! \(\r\\) |\\.)* \((?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\] ]))|”(?:[^\”\r\ \(|\\.|(?:(?:\r\n)?[ \t]))*”(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\] ]))|”(?:[^\”\r\ \(|\\.|(?:(?:\r\n)?[ \t]))*”(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\]

]))|

\[([^\]

! \(\r\\) |\\.)* \((?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\]

]))|

\[([^\]

! \(\r\\) |\\.)* \((?:(?:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)|(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\] ]))|”(?:[^\”\r\ \(|\\.|(?:(?:\r\n)?[ \t]))*”(?:(?:\r\n)?[ \t])*)*:(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\”.\) ! \(00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\] ]))|”(?:[^\”\r\ \(|\\.|(?:(?:\r\n)?[ \t]))*”(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\] ]))|”(?:[^\”\r\ \(|\\.|(?:(?:\r\n)?[ \t]))*”(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\]

]))|

\[([^\]

! \(\r\\) |\\.)* \((?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\]

]))|

\[([^\]

! \(\r\\) |\\.)* \((?:(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\] ]))|”(?:[^\”\r\ \(|\\.|(?:(?:\r\n)?[ \t]))*”(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\]

]))|

\[([^\]

! \(\r\\) |\\.)* \((?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\]

]))|

\[([^\]

! \(\r\\) |\\.)* \((?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\]

]))|

\[([^\]

! \(\r\\) |\\.)* \((?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\”.\) ! \(00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\]

]))|

\[([^\]

! \(\r\\) |\\.)* \((?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\] ]))|”(?:[^\”\r\ \(|\\.|(?:(?:\r\n)?[ \t]))*”(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\] ]))|”(?:[^\”\r\ \(|\\.|(?:(?:\r\n)?[ \t]))*”(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\]

]))|

\[([^\]

! \(\r\\) |\\.)* \((?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\]

]))|

\[([^\]

! \(\r\\) |\\.)* \((?:(?:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)(?:,\s*(?:(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\] ]))|”(?:[^\”\r\ \(|\\.|(?:(?:\r\n)?[ \t]))*”(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\] ]))|”(?:[^\”\r\ \(|\\.|(?:(?:\r\n)?[ \t]))*”(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\]

]))|

\[([^\]

! \(\r\\) |\\.)* \((?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\]

]))|

\[([^\]

! \(\r\\) |\\.)* \((?:(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\] ]))|”(?:[^\”\r\ \(|\\.|(?:(?:\r\n)?[ \t]))*”(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\]

]))|

\[([^\]

! \(\r\\) |\\.)* \((?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\]

]))|

\[([^\]

! \(\r\\) |\\.)* \((?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[\t])*(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\]

]))|

\[([^\]

! \(\r\\) |\\.)* \((?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\]

]))|

\[([^\]

! \(\r\\) |\\.)* \((?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\] ]))|”(?:[^\”\r\ \(|\\.|(?:(?:\r\n)?[ \t]))*”(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\] ]))|”(?:[^\”\r\ \(|\\.|(?:(?:\r\n)?[ \t]))*”(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\]

]))|

\[([^\]

! \(\r\\) |\\.)* \((?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\”.\) ! \( 00-31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\) !”()<>@,;:\\”. \[\]

]))|

\[([^\]

!\(\r\\) |\\.)*

\((?:(?:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*))*)?;\s

Perl 5.10 ?????

????????????????????????????????????? Perl ?????????????????????

/(?(DEFINE)
(?
(?&mailbox) | (?&group)) (? (?&name_addr) | (?&addr_spec)) (? (?&display_name)? (?∠_addr)) (? (?&CFWS)?<(?&addr_spec) > (?&CFWS)?) (? (?&display_name) : (?:(?&mailbox_list) | (?&CFWS))? ; (?&CFWS)?) (? (?&phrase)) (? (?&mailbox) (?: , (?&mailbox))*) (? (?&local_part) \@ (?&domain)) (? (?˙_atom) | (?&quoted_string)) (? (?˙_atom) | (?&domain_literal)) (? (?&CFWS)? \)

! (?: (?&FWS)? (?&dcontent))* (?&FWS)?

\( (?&CFWS)?) (? (?&dtext) | (?&quoted_pair)) (? (?&NO_WS_CTL) | [\x21-\x5a\x5e-\x7e]) (? (?&ALPHA) | (?&DIGIT) | [!#\$%&’*+-/=?^_`{|}~]) (? (?&CFWS)? (?&atext)+ (?&CFWS)?) (? (?&CFWS)? (?˙_atom_text) (?&CFWS)?) (? (?&atext)+ (?: \. (?&atext)+)*) (? [\x01-\x09\x0b\x0c\x0e-\x7f]) (? \\ (?&text)) (? (?&NO_WS_CTL) | [\x21\x23-\x5b\x5d-\x7e]) (? (?&qtext) | (?&quoted_pair)) (? (?&CFWS)? (?&DQUOTE) (?:(?&FWS)? (?&qcontent))* (?&FWS)? (?&DQUOTE) (?&CFWS)?) (? (?&atom) | (?&quoted_string)) (? (?&word)+) # Folding white space (? (?: (?&WSP)* (?&CRLF))? (?&WSP)+) (? (?&NO_WS_CTL) | [\x21-\x27\x2a-\x5b\x5d-\x7e]) (? (?&ctext) | (?&quoted_pair) | (?&comment)) (? \)

(?: (?&FWS)? (?&ccontent))* (?&FWS)? $$ ) (?<CFWS> (?: (?&FWS)? (?&comment))* (?: (?:(?&FWS)? (?&comment)) | (?&FWS))) # No whitespace control (?<NO_WS_CTL> [\x01-\x08\x0b\x0c\x0e-\x1f\x7f]) (?<ALPHA> [A-Za-z]) (?<DIGIT> [0-9]) (?<CRLF> \x0d \x0a) (?<DQUOTE> “) (?<WSP> [\x20\x09]) ) (?&address)/x

Ruby (简单版)

Ruby 表示,其实人家还有个简单版本:

/\A([\w+\-].?)+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i

.NET

这样的版本谁没有啊——.NET 说:

^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

grep 命令

用 grep 命令在文件中查找邮件地址,我想你不会写个若干行的正则表达式吧,意思一下就行了:

$ grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" filename.txt

SQL Server

在 SQL Server 中也是可以用正则表达式的,不过这个代码片段应该是来自某个产品环境中的,所以,还体贴的照顾了那些把邮件地址写错的人:

select email 
 from table_name where 
 patindex ('%[ &'',":;!+=\/()<>]%', email) > 0 -- Invalid characters
 or patindex ('[@.-_]%', email) > 0 -- Valid but cannot be starting character
 or patindex ('%[@.-_]', email) > 0 -- Valid but cannot be ending character
 or email not like '%@%.%' -- Must contain at least one @ and one .
 or email like '%..%' -- Cannot have two periods in a row
 or email like '%@%@%' -- Cannot have two @ anywhere
 or email like '%.@%' or email like '%@.%' -- Cannot have @ and . next to each other
 or email like '%.cm' or email like '%.co' -- Camaroon or Colombia? Typos. 
 or email like '%.or' or email like '%.ne' -- Missing last letter

Oracle PL/SQL

这个是不是有点偷懒?尤其是在那些“复杂”的正则表达式之后:

SELECT email 
FROM table_name
WHERE REGEXP_LIKE (email, '[A-Z0-9._%-]+@[A-Z0-9._%-]+\.[A-Z]{2,4}');

MySQL

好吧,看来最后也一样懒:

SELECT * FROM `users` WHERE `email` NOT REGEXP '^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$';

 

转载请注明:苏demo的别样人生 » 史上最复杂的验证邮件地址的正则表达式

]]>
https://www.libaocai.com/3890.html/feed 0
最全的常用正则表达式大全分享 https://www.libaocai.com/2666.html https://www.libaocai.com/2666.html#respond Wed, 25 Feb 2015 07:16:25 +0000 http://www.libaocai.com/?p=2666 最全的常用正则表达式大全分享完整页_西西软件资讯

正则式太难学,而且容易忘记 ,西西是看过很多次,都是一会就全部不记得了滴。很多不太懂正则的朋友,在遇到需要用正则校验数据时,往往是在网上去找很久,结果找来的还是不很符合要求。所以我最近把开发中常用的一些正则表达式整理了一下,在这里分享一下。给自己留个底,也给朋友们做个参考。

一、校验数字的表达式

 1 数字:^[0-9]*$
 2 n位的数字:^\d{n}$
 3 至少n位的数字:^\d{n,}$
 4 m-n位的数字:^\d{m,n}$
 5 零和非零开头的数字:^(0|[1-9][0-9]*)$
 6 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$
 7 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$
 8 正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$
 9 有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
10 有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
11 非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$
12 非零的负整数:^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$
13 非负整数:^\d+$ 或 ^[1-9]\d*|0$
14 非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
15 非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
16 非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
17 正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
18 负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
19 浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

二、校验字符的表达式

 1 汉字:^[\u4e00-\u9fa5]{0,}$
 2 英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
 3 长度为3-20的所有字符:^.{3,20}$
 4 由26个英文字母组成的字符串:^[A-Za-z]+$
 5 由26个大写英文字母组成的字符串:^[A-Z]+$
 6 由26个小写英文字母组成的字符串:^[a-z]+$
 7 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
 8 由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$
 9 中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$
10 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
11 可以输入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+
12 禁止输入含有~的字符:[^~\x22]+

三、特殊需求表达式

 1 Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
 2 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
 3 InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
 4 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
 5 电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$ 
 6 国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
 7 身份证号(15位、18位数字):^\d{15}|\d{18}$
 8 短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
 9 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
10 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$
11 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$  
12 日期格式:^\d{4}-\d{1,2}-\d{1,2}
13 一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$
14 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$ 
15 钱的输入格式:
16    1.有四种钱的表示形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$ 
17    2.这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$ 
18    3.一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$ 
19    4.这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧.下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$ 
20    5.必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.2" 是通过的:^[0-9]+(.[0-9]{2})?$ 
21    6.这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$ 
22    7.这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$ 
23    8.1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$ 
24    备注:这就是最终结果了,别忘了"+"可以用"*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里
25 xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
26 中文字符的正则表达式:[\u4e00-\u9fa5]
27 双字节字符:[^\x00-\xff]    (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
28 空白行的正则表达式:\n\s*\r    (可以用来删除空白行)
29 HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? />    (网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力)
30 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$)    (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
31 腾讯QQ号:[1-9][0-9]{4,}    (腾讯QQ号从10000开始)
32 中国邮政编码:[1-9]\d{5}(?!\d)    (中国邮政编码为6位数字)
33 IP地址:\d+\.\d+\.\d+\.\d+    (提取IP地址时有用)

转载请注明:苏demo的别样人生 » 最全的常用正则表达式大全分享

]]>
https://www.libaocai.com/2666.html/feed 0
PHP正在表达式提取图片地址 https://www.libaocai.com/1298.html https://www.libaocai.com/1298.html#respond Sun, 04 Jan 2015 06:35:13 +0000 http://www.libaocai.com/?p=1298 $str='<p style="padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: 200%;"><img border="0" src="http://blog.163.com/litianyichuanqi@126/blog/upfiles/2009/07/1246430143_4.jpg" alt=""/></p><p style="padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: 200%;"><img border="0" src="http://blog.163.com/litianyichuanqi@126/blog/upfiles/2009/07/1246430143_3.jpg" alt=""/></p><p style="padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: 200%;"><img border="0" src="http://blog.163.com/litianyichuanqi@126/blog/upfiles/2009/07/1246430143_1.jpg" alt=""/></p>';    $pattern="/<[img|IMG].*?src=[\'|\"](.*?(?:[\.gif|\.jpg]))[\'|\"].*?[\/]?>/";    preg_match_all($pattern,$str,$match);    print_r($match);

转载请注明:苏demo的别样人生 » PHP正在表达式提取图片地址

]]>
https://www.libaocai.com/1298.html/feed 0
最强的匹配网址的正则表达式 https://www.libaocai.com/1051.html https://www.libaocai.com/1051.html#respond Sun, 04 Jan 2015 04:47:40 +0000 http://www.libaocai.com/?p=1051 几乎可以匹配任何网址:

^((https?|ftp|news):\/\/)?([a-z]([a-z0-9\-]*[\.。])+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)|(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))(\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(\?[a-z0-9+_\-\.%=&]*)?)?(#[a-z][a-z0-9_]*)?$

实例:

<script type=”text/javascript”>
function IsURL(urlString)
{
regExp = /^((https?|ftp|news):\/\/)?([a-z]([a-z0-9\-]*[\.。])+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)|(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))(\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(\?[a-z0-9+_\-\.%=&]*)?)?(#[a-z][a-z0-9_]*)?$/
  
if (urlString.match(regExp))

return “is a url”;
else

return “not a url”;       
}

url = “http://www.hlwenhan“;
alert(IsURL(url));
</script>

转载请注明:苏demo的别样人生 » 最强的匹配网址的正则表达式

]]>
https://www.libaocai.com/1051.html/feed 0
正则匹配C语言风格的注释 https://www.libaocai.com/907.html https://www.libaocai.com/907.html#respond Sun, 04 Jan 2015 03:31:21 +0000 http://www.libaocai.com/?p=907 要求匹配类似 /***则是注释**/  这样的注释/\*([^\*]|(\*)*[^\*/])*(\*)*\*/

转载请注明:苏demo的别样人生 » 正则匹配C语言风格的注释

]]>
https://www.libaocai.com/907.html/feed 0