我必须将字符串匹配为user@domain:端口。因此,它应该允许域或域:端口或user@domain或user@domain:端口已完成。最初,我编写了多个正则表达式来匹配以下条件:
preg_match('/^[A-z0-9_-]+[@][A-z0-9_-]+([.][A-z0-9_-]+)+[A-z.]{2,4}$/', $str) or preg_match('/^[A-z0-9_-]+([.][A-z0-9_-]+)+[A-z.]{2,4}$/', $str) or preg_match('/^[A-z0-9_-]+([.][A-z0-9_-]+)+[A-z.]{2,4}+([:][0-9]+)$/', $str)
但现在我必须覆盖所有的条件,如上所述,我认为应该有一个表达式可以通过所有的条件。
有人能告诉我正确的常规exp以匹配所有条件并给出一些解释吗?
我想用PHP来做。
这里有一些东西可以帮助您
正则表达式
^(?:([w-]+)@)?([w-.]+.[a-zA-Z][w-]+)(?::([0-9]{1,5}))?$
应该做你想做的事。让我们来解释一下:您首先要匹配(如果存在)一个用户,然后是@
。要匹配一个单词,您可以使用w
,但在正则表达式中,您指定了不包含在w
中的字符-
(但_
包含在内)。因此,为了匹配您的用户,您将执行以下操作:
(?:([w-]*)@)?
然后你想匹配一个域名
([w-.]+.[a-zA-Z][w-]+)
域名必须以至少一个点和一个单词结尾(顶级域名)。顶级域不是以数字开头的(此规则是基于usedTopLevelDomainList 创建的
最后,你想匹配一个1-5位的端口:
(?::([0-9]{0,5}))?
如前所述,正则表达式可以匹配不在255最大范围内的IPv4验证IPv4的正则表达式是:
^(?:(?: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]?)$
来源。我已经更新了以前的正则表达式,将IP匹配从我的正则表达式中排除,并为域名添加了OR
语句,以匹配基于上述正则表达式的IPv4或我以前定义的域。
分组分离每个部分的结果:
^(?:([w-]+)@)?((?:[w-.]+.[a-zA-Z][w-]+)|(?:(?: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]?))(?::([0-9]{1,5}))?$
没有任何组的结果只匹配有效案例:
^(?:[w-]+@)?(?:(?:[w-.]+.[a-zA-Z][w-]+)|(?:(?: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]?))(?::[0-9]{1,5})?$
您可以使用
^(?:(?:[w-]+@)?(?:[w-]+).[w.-]+(?::[0-9]{1,5})?)$
查看regex演示
我遇到的问题是,第一个user@
对于第二个正则表达式是可选的,但对于第三部分是必需的。我的正则表达式匹配:
(?:(?:[w-]+@)?(?:[w-]+).[w.-]+(?::[0-9]{1,5})?
-(?:[w-]+@)?
-1个或多个字母数字的1个或0个序列,或后面跟着@
的-
[w-]+
-1个或多个字母数字字符或-
.[w.-]+
-后面跟着一个或多个字母数字字符的文字点,.
或-
(?::[0-9]{1,5})?
-冒号的1或0序列,后跟1到5位数字