如何在BASH脚本中使用以下正则表达式?
(?=^.{8,255}$)((?=.*\d)(?!.*\s)(?=.*[A-Z])(?=.*[a-z]))^.*
我需要检查以下用户输入(密码):
答案 0 :(得分:3)
如果您的grep
版本具有-P
选项,则它支持PCRE(Perl兼容的正则表达式。
grep -P '(?=^.{8,255}$)(?=^[^\s]*$)(?=.*\d)(?=.*[A-Z])(?=.*[a-z])'
我不得不改变你的表达式以拒绝空格,因为它总是失败。额外的括号似乎没有必要。我最后离开了^.*
,因为它始终匹配,你真的只需要像这样的布尔结果:
while ! echo "$password" | grep -P ...
do
read -r -s -p "Please enter a password: " password
done
答案 1 :(得分:1)
我不认为你的正则表达式是检查列表中的东西的最佳(或正确吗?)方式(提示:我会独立于其他条件检查长度),但要回答关于在Bash中使用它的问题:使用grep -Eq
的返回值,例如:
if echo "$candidate_password" | grep -Eq "$strong_pw_regex"; then
echo strong
else
echo weak
fi
或者在Bash 3及更高版本中,您可以使用=~
运算符:
if [[ "$candidate_password" =~ "$strong_pw_regex" ]]; then
…
fi
grep -E
或Bash的regexp语法不一定支持您在示例中使用的所有内容,但可以使用其中任何一种来检查您的要求。但是如果你想要更漂亮的正则表达式,你可能需要用Ruby或Perl代替Bash。
至于修改正则表达式,请使用Bash检查长度(${#candidate_password}
为您提供变量candidate_password
中字符串的长度),然后使用不带前瞻的简单语法。为简单起见,您甚至可以使用单独的正则表达式检查所有三个条件。
答案 2 :(得分:0)
grep
选项的 -E
使用扩展正则表达式(ERE)
从此documentation ERE不支持预测。
所以你可以将Perl用作:
perl -ne 'exit 1 if(/(?=^.{8,255}$)((?=.*\\d)(?=.*[A-Z])(?=.*[a-z])|(?=.*\\d)(?=.*[^A-Za-z0-9])(?=.*[a-z])|(?=.*[^A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z])|(?=.*\\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9]))^.*/);exit 0;'
答案 3 :(得分:0)
答案 4 :(得分:0)
这些匹配与逻辑AND运算符相关联,这意味着唯一的匹配就是当它们全部匹配时。 因此,最简单的方法是匹配链接的那些条件,将先前的结果传送到下一个表达式。然后,如果任何匹配失败,则整个表达式失败:
$echo "tEsTstr1ng" | egrep "^.{8,255}"| egrep "[ABCDEFGHIJKLMNOPQRSTUVWXYZ]"| egrep "[abcdefghijklmnopqrstuvwxyz"] | egrep "[0-9]"
我手动输入了所有字符而不是“[AZ]”和“[az]”,因为不同的系统区域设置可能会将它们替换为[aAbBcC ...,这是一场比赛中的两个条件,我们需要检查两个条件。
作为shell脚本:
#!/bin/sh
a="tEsTstr1ng"
b=`echo $a | egrep "^.{8,255}" | \
egrep "[ABCDEFGHIJKLMNOPQRSTUVWXYZ]" | \
egrep "[abcdefghijklmnopqrstuvwxyz"] | \
egrep "[0-9]"`
# now featuring W in the alphabet string
#if the result string is empty, one of the conditions has failed
if [ -z $b ]
then
echo "Conditions do not match"
else
echo "Conditions match"
fi