为什么这个正则表达式几乎与所有内容相匹配?

时间:2016-03-04 19:30:16

标签: regex bash

我无法解释,但请查看以下内容:

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

带有+符号的用户名不应与该正则表达式匹配。

3 个答案:

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