【问题标题】:What's wrong with this Regular Expression for URL这个 URL 的正则表达式有什么问题
【发布时间】:2013-12-21 02:44:50
【问题描述】:

我正在编写一个应该匹配这种类型的 URL 的正则表达式

http(s)://a.b.c.domain.company.com(:8000)

协议可以是http和https,端口是可选的

我已经写好了

$reg = "^(http|https)(\://)([a-zA-Z0-9\-\.]){6,}(\:[0-9]*)?\/?"
$url1 = "http://uat.upm.goal.services.ps.com"
$url2 = "http://uat.upm.goal.services.ps.com:9000/"
$url3 = "http://uat.upm.goal.services.ps.com:9000?name=foo"
$flag1 = $url1 -Match $reg
$flag2 = $url2 -Match $reg
$flag3 = $url3 -Match $reg
echo $flag1
echo $flag2
echo $flag3   

我希望 $url1 和 $url2 匹配正则表达式...但是 $url3 应该匹配失败(因为它包含命令)。我希望 URL 以 .com 或 .com:8000 或 .com:8000/ 结尾。

在(可选的)端口和 / 之后我不想要任何东西。

【问题讨论】:

  • 为什么最后是^
  • 我正在尝试强制检查 URL 是否以 .com 或 .com:8000 或 .com:8000/ 结尾,但您不能说 .com:8000/?cmd=foo
  • 为什么限制为{6}?我以为你想通过.com 匹配。另外,我认为您需要转义正斜杠。

标签: regex


【解决方案1】:

试试"^(http|https)(\://)([a-zA-Z0-9\-\.]){6,}(\:[0-9]*)?\/?"

对于没有查询部分的网址,请使用:
"^(http|https)(\://)([a-zA-Z0-9\-\.]){6,}(\:[0-9]*)?\/?$"

$ 表示行/字符串结束

我删除了末尾的^,因为它是一个特殊的字符,表示行首

我将{6} 更改为{6,},这意味着该组必须至少有 6 个字符

我在 awk 中对此进行了测试,结果匹配:

awk='/^(http|https)(\:\/\/)([a-zA-Z0-9\-\.]){6,}(\:[0-9]*)?\/?$/'
echo "http://u.ucm.project.services.ps.com" | awk "$awk {print\$0}"
echo "https://z.ucm.project.services.ps.com:22400/" | awk "$awk {print\$0}"
echo "http://uat.upm.goal.services.ps.com:9000?name=foo" | awk "$awk {print\$0}"

如你所愿,只有前两个匹配。

【讨论】:

  • 我试过你的模式。你看它允许命令......但我不想要命令。在下面的示例中,$url1 和 $url2 应该匹配但 $url3 不应该匹配` $reg = "^(http|https)(\://)([a-zA-Z0-9\-\.]) {6,}(\:[0-9]*)?\/?" $url1 = "uat.upm.goal.services.ps.com" $url2 = "uat.upm.goal.services.ps.com:9000" $url3 = "uat.upm.goal.services.ps.com:9000?name=foo" $flag1 = $url1 -Match $reg $flag2 = $url2 -Match $reg $flag3 = $url3 -Match $ reg echo $flag1 echo $flag2 echo $flag3` 但所有 3 个网址都与您的正则表达式匹配。
【解决方案2】:

您在字母组之后缺少+。所以([a-zA-Z0-9\-\.]){6} 应该是([a-zA-Z0-9\-\.]+){6},这样至少有一个字符,可能还有更多。

此外,{6} 没有按照您的预期进行(匹配 6 个点的域),因为您编写它的方式。要么删除它,并允许任意数量的点分隔域部分,要么将其更改为:

([a-zA-Z0-9\-]+\.){6}

【讨论】:

  • 但我有 /?这意味着最后的 / 是可选的。你提到的这个 + 会使其成为 1 次或多次......但我想要特定的 6 次出现。
  • ^ 在这里用作模式的分隔符。
  • 是的,只是想通了。我的回答还有另一个错误。已更新。
  • 由于com 后面没有点,你应该把它改成([a-zA-Z0-9\-]+\.){5}(com|org|net) 或类似的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多