尝试合并来自here的两个正则表达式,以在单个语句中验证主机名和IP地址。
我让它们分开工作,但是当使用|
进行组合时,事情变得棘手,匹配主机名和ips的片段,而不是整个有效模式,这不是我想要的。我需要一个正则表达式,使用下面的主机名和IP模式来匹配主机或IP地址。
我已经提供了便于测试每个图案的便笺簿;最后一个是我尝试将它们组合在一起,示例说明正则表达式匹配无效片段。
^((([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9]))$
^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3})$
^((([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9]))|((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3})$
答案 0 :(得分:2)
您有优先权问题。你写的时候
^(regex1)|(regex2)$
它被解释为
(^(regex1))|((regex2)$)
因此,任何以有效主机名开头或以IP地址结尾的行都可以匹配。一个解决方案就是
^regex1$|^regex2$
出现如下:
^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3})$|^((([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9]))$