mal*_*hus 2 bash regular-expression
我想创建一个密码输入模板,条件是:
我已经利用负前瞻来创建一个模式,但这不起作用。我的模式:
^(.{0,11}|[^0-9]*|[^A-Z]*|[^a-z]*|[a-zA-Z0-9<>~`|"\']*|[^\s]*\s.*)$
Run Code Online (Sandbox Code Playgroud)
操作系统:Ubuntu 20.04
你的问题没有提到你如何尝试使用你的表达方式。shell中的正则表达式bash
是 POSIX 扩展正则表达式。这些不支持正向或负向前瞻或后向查看。
我建议不要使用您的表达式来尝试将更多内容放入其中,而是将测试分解为几个单独的测试。
\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
保存正则表达式,[<>`"\'~]
以减少表示它所需的引用。
在POSIX
akaC
语言环境中,POSIX[:punct:]
字符类包含以下字符集中的字符:
!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~\n
Run Code Online (Sandbox Code Playgroud)\n在常规语言环境中,它通常会包含更多\xc2\xb9。
\n我在这里使用它作为“特殊字符”的替代品。
\n例如,\xc2\xb9 在 Ubuntu 20.04 和 en_GB.UTF-8 语言环境中,它包含 147495 个不同的字符。YMMV 取决于系统、版本和区域设置。
\n