Bash 密码的正则表达式模式可排除带有负向前瞻的特定特殊字符

mal*_*hus 2 bash regular-expression

我想创建一个密码输入模板,条件是:

  1. 密码长度必须至少为 12 个字符;
  2. 必须至少有1个小写字母、1个大写字母、1个数字、1个特殊字符;
  3. 不允许使用<>`"'~等特定特殊字符;
  4. 顺序无所谓,只要满足前面3个条件即可。

我已经利用负前瞻来创建一个模式,但这不起作用。我的模式:

^(.{0,11}|[^0-9]*|[^A-Z]*|[^a-z]*|[a-zA-Z0-9<>~`|"\']*|[^\s]*\s.*)$
Run Code Online (Sandbox Code Playgroud)

操作系统:Ubuntu 20.04

Kus*_*nda 9

你的问题没有提到你如何尝试使用你的表达方式。shell中的正则表达式bash是 POSIX 扩展正则表达式。这些不支持正向或负向前瞻或后向查看。

\n

我建议不要使用您的表达式来尝试将更多内容放入其中,而是将测试分解为几个单独的测试。

\n

如果每个测试都是独立完成的,那么理解实现并保持它的维护是最容易的,而不是试图制作一个怪物表达式来完成这一切。

\n
#!/bin/bash\n\npw_is_valid () {\n        local avoid=\'[<>`"\'"\'"\'~]\'\n\n        [ "${#1}" -ge 12 ] &&\n        [[ $1 =~ [[:upper:]] ]] &&\n        [[ $1 =~ [[:lower:]] ]] &&\n        [[ $1 =~ [[:digit:]] ]] &&\n        [[ $1 =~ [[:punct:]] ]] &&\n        [[ ! $1 =~ $avoid ]]\n}\n\nuntil\n        IFS= read -r -s -p \'Enter password: \' pw\n        pw_is_valid "$pw"\ndo\n        echo \'Try again\' >&2\ndone\n
Run Code Online (Sandbox Code Playgroud)\n

我正在使用变量 来avoid保存正则表达式,[<>`"\'~]以减少表示它所需的引用。

\n

POSIXakaC语言环境中,POSIX[:punct:]字符类包含以下字符集中的字符:

\n
!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~\n
Run Code Online (Sandbox Code Playgroud)\n

在常规语言环境中,它通常会包含更多\xc2\xb9。

\n

我在这里使用它作为“特殊字符”的替代品。

\n
\n

例如,\xc2\xb9 在 Ubuntu 20.04 和 en_GB.UTF-8 语言环境中,它包含 147495 个不同的字符。YMMV 取决于系统、版本和区域设置。

\n