我无法编写正则表达式来验证和分组以下内容:
- c1dev01 --> 有效
- c1dev01:25 --> 有效
- 192.168.2.3 --> 有效
- 192.168.2.3:189 --> 有效
- c1dev01: --> 有效
- c1dev01:aa --> 无效
我想正确范围的验证最好不要在正则表达式中完成,而是在一个单独的步骤中完成。但是,正则表达式非常适合验证字符串格式并一次性提取端口号。对于格式,我们最多需要一个冒号,并且只需要它右边的数字(最多 5 个)。这对应于以下模式字符串:
@"^([^:]+)(?:[:](\d{0,5}))?$"
其中 ^ 和 $ 将模式锚定到字符串的开头和结尾。如果在 Regex.Match() 中使用此模式,则可以在 match.Groups[1].Value 中找到主机名,在 match.Groups[2].Value 中找到端口号,以检查它是否不超过 65535。
当然,您可以进一步限制主机允许的字符。
^(?(\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})|(\w+))(:(?\d{0 ,5}))*$
获取主机/IP 使用match.Group["host"]
并获取端口使用match.Group["posrt"]
。