我正在编写一个正则表达式,该表达式应匹配此类型的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 /
结尾在(可选)端口和/.
之后我不想要任何东西答案 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}"
如你所愿,只有前两个匹配。