Я читал, хотя этот другой вопрос, который имеет некоторый действительно хороший regex's для задания, но насколько я вижу не их, работает с командами Bash, поскольку команды Bash не поддерживают такой сложный rexeg's.
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 имел "расширенную-regex" (-E) опцию, которая, кажется, заставляет его работать. Но если бы у кого-либо есть лучший/быстрее путь, я все еще любил бы здесь об этом.
Следующие действия работают в Bash> = версии 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
Ваше регулярное выражение не содержит буквенных символов в нижнем регистре [az]
, поэтому я добавил их сюда .
Вероятно потому что регулярное выражение написано в синтаксисе PCRE. Посмотрите, есть ли у вас (или можете ли вы установить) программу pcregrep
в вашей системе - она имеет тот же синтаксис, что и grep
, но принимает Perl-совместимые регулярные выражения - и вы сможете это сделать Работа.
Другой вариант - попробовать параметр -P
для grep
, но на странице руководства сказано, что это «в высшей степени экспериментально», так что это может или не может работать.
Я скажу, что вам следует тщательно подумать о том, действительно ли уместно использовать это или любое другое регулярное выражение для проверки URL-адреса. Если вы хотите иметь правильную проверку, вам, вероятно, будет лучше найти или написать небольшой скрипт, скажем, на Perl, чтобы использовать средства проверки URL-адресов языка.
РЕДАКТИРОВАТЬ : в ответ на ваше изменение в вопросе я не заметил, что это регулярное выражение также действует в «расширенном» синтаксисе. Я не думаю, что вы можете стать лучше / быстрее, чем это.