我必须将字符串匹配为user @ domain:port。所以它应该允许域或域:端口或用户@域或用户@域:端口完成。最初我写了多个正则表达式来匹配其中的一些条件,如下所示:
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来做。
答案 0 :(得分:0)
Here可以帮助您
正则表达式
^(?:([\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]?)$
Source。我已经更新了以前的正则表达式,以从我的正则表达式中排除IP匹配,并为域名添加OR
语句,以匹配基于上述正则表达式的IPv4或我之前定义的域。< / p>
Result与小组分开各个部分:
^(?:([\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}))?$
Result没有任何组只匹配有效案例:
^(?:[\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})?$
答案 1 :(得分:0)
您可以使用
^(?:(?:[\w-]+@)?(?:[\w-]+)\.[\w.-]+(?::[0-9]{1,5})?)$
请参阅regex demo
我遇到的问题是第一个user@
对于第二个正则表达式是可选的,但对于第三个部分是强制性的。我的正则表达式匹配:
(?:(?:[\w-]+@)?(?:[\w-]+)\.[\w.-]+(?::[0-9]{1,5})?
-
(?:[\w-]+@)?
- 包含1个或多个字母数字或-
的1或0个序列,然后是@
[\w-]+
- 一个或多个字母数字字符或-
\.[\w.-]+
- 一个字面点后跟一个或多个字母数字字符,.
或-
(?::[0-9]{1,5})?
- 1或0个冒号序列,后跟1到5位