我无法解释,但请查看以下内容:
name=$1
pat="\b[0-9a-zA-Z_]+\b"
if [[ $name =~ $pat ]]; then
echo "$name is ok as user name"
else
echo "$name is not ok as user name"
exit 1
fi
试运行:
./script test_user+
test_user+ is ok as user name
带有+符号的用户名不应与该正则表达式匹配。
答案 0 :(得分:5)
首先:
\b
是PCRE扩展名;它不适用于=~
的ERE bash的[[ ]]
语法中的运算符使用。
(来自Bash regex match with word boundary)
其次,如果您希望强制整个字符串匹配,则不需要单词边界(\b
)。您希望匹配开头(^
)和结束($
):
pat="^[0-9a-zA-Z_]+\$"
答案 1 :(得分:0)
如果你不想要单词绑定(猜测你正在尝试用户名匹配),请使用
^[0-9a-zA-Z_]+$
答案 2 :(得分:0)
与OP的经验和其他答案相反,\b
支持Ubuntu 14.04, bash 4.3.11
为字边界。这是一个示例:
re='\bb[0-9]+\b'
[[ 'b123' =~ $re ]] && echo "matched" || echo "nope"
matched
[[ 'b123_' =~ $re ]] && echo "matched" || echo "nope"
nope
即使\<
和\>
也可以正常工作:
re='\<b[0-9]+\>'
[[ 'b123' =~ $re ]] && echo "matched" || echo "nope"
matched
[[ 'b123_' =~ $re ]] && echo "matched" || echo "nope"
nope
但\b
的支持仅适用于某些操作系统。例如在OSX下面作为单词边界:
[[ 'b123' =~ [[:\<:]]b[0-9]+[[:\>:]] ]] && echo "matched" || echo "nope"
matched
[[ 'b123_' =~ [[:\<:]]b[0-9]+[[:\>:]] ]] && echo "matched" || echo "nope"
nope