要匹配的正则表达式user@domain:端口


Regular expression to match user@domain:port

我必须将字符串匹配为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位数字