您的正则表达式有点多余,因为您或其他已包含在其他或块中的某些内容。
我只是简化了你必须做的事情
(?:[A-Za-z0-9-]+\.)+[A-Za-z0-9]{1,3}:\d{1,5}
它工作得很好......
我不确定为什么您在允许的字符中有 \,因为我很确定在主机名中不允许使用 \。
您的问题是您的或 | 像这样把事情拆散...
[A-Za-z0-9\\-]+
或者
[A-Za-z0-9]{1,3}\\.[A-Za-z0-9]{1,3}\\.[A-Za-z0-9]{1,3}\\.[A-Za-z0-9]{1,3}
或者
\*
正如评论员所说,第二个区块中不包括“-”。
所以也许你打算
^((?:[A-Za-z0-9\\-]+|[A-Za-z0-9]{1,3})\.[A-Za-z0-9]{1,3}\.[A-Za-z0-9]{1,3}\.[A-Za-z0-9]{1,3}):([0-9]{1,5}|\*)$
然而,前两个 or'ed 项目将是多余的,因为 + 包括 {1-3}。
IE。[A-Za-z0-9\-]+ 也将匹配与 [A-Za-z0-9]{1,3} 匹配的任何内容
您可以使用此工具来帮助测试您的正则表达式:
http ://regexpal.com/
我个人认为每个开发人员都应该有regexbuddy
上面的正则表达式虽然有效,但将允许无效的主机名。
它应该被修改为不允许在第一个字符中使用标点符号。
所以应该修改成这样。
(?:[A-Za-z0-9][A-Za-z0-9-]+\.)(?:[A-Za-z0-9-]+\.)+[A-Za-z0-9]{1,3}:\d{1,5}
同样在理论上,主机不允许以连字符结尾。
这一切都太复杂了,我只会使用正则表达式来捕获部分,然后使用 Uri.CheckHostName 来实际检查 Uri 是否有效。
或者您可以只使用 CodeCaster 建议的正则表达式