【问题标题】:Regex to validate domain name with port正则表达式使用端口验证域名
【发布时间】:2013-04-17 11:24:48
【问题描述】:

我是新开发人员,对正则表达式了解不多。今天我分配使用正则表达式修复一个错误,但经过大量努力我无法找到错误。

这是我的要求。

我的代码是:

string regex = "^([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}|\\*)$";

Regex _hostEndPointRegex = new Regex(regex);

bool isTrue = _hostEndPointRegex.IsMatch(textBox1.Text);

它会为“nikhil-dev.in.abc.ni:8080”之类的域名抛出错误。

我不确定问题出在哪里。

【问题讨论】:

  • 我认为您的问题是 - 未被允许...也就是说,我的 RegEx 不是很好。
  • 为什么要重新发明*?有一些函数,如Uri.CheckHostName()(假设为here)和一个可怕的正则表达式显示here

标签: c# .net regex


【解决方案1】:

您的正则表达式有点多余,因为您或某些东西已经包含在另一个或块中。

我只是简化了你必须做的事情

(?:[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}。

即。 [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 建议的正则表达式

【讨论】: