Bash /正则表达式转换

时间:2018-10-22 11:03:46

标签: regex bash

我是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

谢谢。

1 个答案:

答案 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