我是RegEx的新手,它具有可工作的RegEx模式,该模式似乎与Bash / Shell不兼容。我一直在阅读有关\ d在Bash中不受支持的信息。谁能帮助我尝试理解不兼容之处并使此表达有效?
#!/bin/bash
passwordToTest="test@"
regExPattern="(?=^.{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]))^.*"
if [[ $passwordToTest =~ $regExPattern ]]; then
echo "$passwordToTest is valid"
exit 0
else
echo "$passwordToTest is invalid"
exit 1
fi
谢谢。
答案 0 :(得分:0)
bash正则表达式无法处理的另一种构造是超前的。
解码正则表达式在做什么
(?=^.{8,255}$) at least 8 and no more than 255 characters
( either
(?=.*\d) a digit
(?=.*[A-Z]) and an uppercase
(?=.*[a-z]) and a lowercase
| or
(?=.*\d) and a digit
(?=.*[^A-Za-z0-9]) and a special char
(?=.*[a-z]) and a lowercase
| or
(?=.*[^A-Za-z0-9]) a special char
(?=.*[A-Z]) and an uppercase
(?=.*[a-z]) and a lowercase
| or
(?=.*\d) a digit
(?=.*[A-Z]) and an uppercase
(?=.*[^A-Za-z0-9]) and a special char
)^.*
如果它支持PCRE,则可以使用grep完成
if grep -Pq "$regExPattern" <<<$passwordToTest >/dev/null; then
或使用bash语言编写逻辑
if
containsDigit=0
containsUpper=0
containsLower=0
containsSpecial=0
lang=$LANG LANG=C
[[ $passwordToTest = *[0-9]* ]] && containsDigit=1
[[ $passwordToTest = *[A-Z]* ]] && containsUpper=1
[[ $passwordToTest = *[a-z]* ]] && containsLower=1
[[ $passwordToTest = *[^0-9A-Za-z]* ]] && containsSpecial=1
LANG=$lang
(( ${#passwordToTest} >=8 )) &&
(( ${#passwordToTest} <=255 )) &&
(( containsDigit + containsUpper + containsLower + containsSpecial >= 3 ))
then