bash + 通过正则表达式验证名称

bash + 通过正则表达式验证名称

valid当名称为 时,为什么会打印以下正则表达式hdpworker01

name=hdpworker01
[[ $name =~ worker[[:digit:]] ]] && echo valid

我尝试做的是valid仅在名称匹配时才打印worker[0-999]

预期结果示例:

  • 为了name=worker01valid
  • 对于name=hdpworker01:无输出

答案1

默认情况下,正则表达式不锚定到字符串的开头或结尾。这与文件名通配模式等不同。这意味着表达式可以匹配给定字符串中的任何位置。

要将表达式锚定到字符串的开头,请使用

^worker[[:digit:]]

要将其另外锚定到字符串的末尾并允许一到三位数字,请使用

^worker[[:digit:]]{1,3}$

如果您想匹配worker10但不想匹配worker01or worker003(无零填充数字),请使用

^worker([0-9]|[1-9][0-9]{1,2})$

答案2

将正则表达式锚定在两侧。

^worker[[:digit:]]$

答案3

为什么下面的正则表达式打印有效,而名称是 hdpworker01

为什么?因为正则表达式不是锚定的,即它没有定义应该匹配的字符串的开头(或结尾)。worker如果匹配的字符串的任何部分是,则正则表达式将匹配worker。它将匹配hdpworkeranything以及worker许多其他变体。要匹配以 开头的字符串,worker请使正则表达式包含^,例如:

^worker

如果您想在单词worker之后匹配(最多)3位数字,您可以使用:

^worker[0-9]{0,3}$

但是,明智的做法是捕获带括号的数字并将正则表达式放置在变量中(使用变量是当前的最佳实践):

re='^worker([0-9]{0,3})$'

$意味着字符串应该在该点结束。
比赛将变成:

[[ $str =~ $re ]] && n=$((10#${BASH_REMATCH[1]}+0)) || n=-1

我尝试做的是仅在名称为worker[0-999]时才打印有效

这将允许检查数字n范围:

(( 0 <= n && n <= 999 )) && echo "valid with n=$n"

相关内容