valid
当名称为 时,为什么会打印以下正则表达式hdpworker01
?
name=hdpworker01
[[ $name =~ worker[[:digit:]] ]] && echo valid
我尝试做的是valid
仅在名称匹配时才打印worker[0-999]
。
预期结果示例:
- 为了
name=worker01
:valid
- 对于
name=hdpworker01
:无输出
答案1
默认情况下,正则表达式不锚定到字符串的开头或结尾。这与文件名通配模式等不同。这意味着表达式可以匹配给定字符串中的任何位置。
要将表达式锚定到字符串的开头,请使用
^worker[[:digit:]]
要将其另外锚定到字符串的末尾并允许一到三位数字,请使用
^worker[[:digit:]]{1,3}$
如果您想匹配worker10
但不想匹配worker01
or 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"