我正在阅读这个other question,它有一些非常好的正则表达式,但据我所知,由于BASH命令不支持这种复杂的rexeg,所以它们不能用于BASH命令。</ p >
if echo "http://www.google.com/test/link.php" | grep -q '(https?|ftp|file)://[-A-Z0-9\+&@#/%?=~_|!:,.;]*[-A-Z0-9\+&@#/%=~_|]'; then
echo "Link valid"
else
echo "Link not valid"
fi
但这不起作用,因为grep -q不起作用......
编辑,好吧我刚刚意识到grep有一个“扩展正则表达式”(-E)选项,似乎可以使它工作。但如果有人有更好/更快的方式,我仍然会喜欢这里。
答案 0 :(得分:18)
以下适用于Bash&gt; =版本3.2而不使用grep
:
regex='(https?|ftp|file)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]'
string='http://www.google.com/test/link.php'
if [[ $string =~ $regex ]]
then
echo "Link valid"
else
echo "Link not valid"
fi
您的正则表达式似乎不包含小写字母字符[a-z]
,所以我在这里添加了它们。
答案 1 :(得分:1)
可能是因为正则表达式是用PCRE语法编写的。看看你的系统上是否有(或可以安装)程序pcregrep
- 它的语法与grep
相同但接受Perl兼容的正则表达式 - 你应该能够做到这一点。
另一个选择是尝试-P
选项grep
,但是手册页说“高度实验性”,因此它可能会或可能不会真正起作用。
我会说你应该仔细考虑使用这个或任何正则表达式验证URL是否合适。如果你想要进行正确的验证,你可能最好在Perl中查找或编写一个小脚本,以使用该语言的URL验证工具。
编辑:为了回答您在问题中的编辑,我没有注意到该正则表达式在“扩展”语法中也有效。我认为你不会比那更好/更快。
答案 2 :(得分:1)
由于我没有足够的代表在上面发表评论,因此我将对此进行修改,以修改上面丹尼斯给出的答案。
我将Christopher的更新合并到了正则表达式中,然后添加了更多内容,以便URL至少必须采用以下格式:
http://w.w(必须有一个句点)。
并调整了一点输出:)
regex='^(https?|ftp|file)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]\.[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]$'
url='http://www.google.com/test/link.php'
if [[ $url =~ $regex ]]
then
echo "$url IS valid"
else
echo "$url IS NOT valid"
fi