这个正则表达式URL有什么问题

时间:2013-12-20 18:18:20

标签: regex

我正在编写一个正则表达式,该表达式应匹配此类型的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应该使匹配失败(因为它包含了comtains命令)。我希望URL以.com或.com:8000或.com:8000 /

结尾

在(可选)端口和/.

之后我不想要任何东西

2 个答案:

答案 0 :(得分:1)

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

此外,由于你编写它的方式,{6}没有达到预期的效果(匹配6点的域)。删除它,并允许任意数量的点分隔域部分或将其更改为:

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

答案 1 :(得分: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}"

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