我试图建立一个复杂的正则表达式,我记得读过一篇关于电子邮件地址验证的文章,其中正则表达式的每个部分都被分解为更简单的单个正则表达式,如:
email := <localpart>@<domainpart>
localpart := (?:<mailbox>\+)?(<username>)
domainpart := <domainname>\.<tld>
etc...
但我似乎无法找到类似的任何文件。有没有类似的有效的,程序化的语法,还是我错误地记住了一些RFC风格的伪代码?
注意:
filter_var()
和FILTER_VALIDATE_EMAIL
。答案 0 :(得分:1)
我正在寻找的语法,正如@HamZa在评论中所建议的那样:
/
(?(DEFINE)
(?<userpart> thomas | richard | harold )
(?<domainpart> gmail | yahoo | hotmail )
(?<tld> com | net | co\.uk )
(?<email> (?&userpart)@(?&domainpart)\.(?&tld) )
)
^To:\s.*\s<(?&email)>$
/xi
其匹配的行如下:To: Mr. Selleck <thomas@gmail.com>
编辑:我还发现了一种可以使用的更多与实现无关的语法:https://stackoverflow.com/a/22871592/1064767
答案 1 :(得分:-1)
在perl中,许多perl样式的正则表达式解决方案/x
意味着忽略空格,并有评论(样本从perl.com无耻地拉出
$_ =~ m/^ # anchor at beginning of line
The\ quick\ (\w+)\ fox # fox adjective
\ (\w+)\ over # fox action verb
\ the\ (\w+) dog # dog adjective
(?: # whitespace-trimmed comment:
\s* \# \s* # whitespace and comment token
(.*?) # captured comment text; non-greedy!
\s* # any trailing whitespace
)? # this is all optional
$ # end of line anchor
/x; # allow whitespace
你也可以使用正则表达式的变量(取自perlop),包括多个变量,注意不要使用用户输入以免创建“正则表达式注入”。将正则表达式存储为字符串然后在正则表达式字符串中连接该字符串将适用于任何允许您将正则表达式存储为字符串的语言(我所知道的所有内容)
$rex = qr/my.STRING/is;
print $rex; # prints (?si-xm:my.STRING)
s/$rex/foo/;