![“^[0-9]+$”的含义?](https://linux22.com/image/133807/%E2%80%9C%5E%5B0-9%5D%2B%24%E2%80%9D%E7%9A%84%E5%90%AB%E4%B9%89%EF%BC%9F.png)
这个表达式模式'^[0-9]+$'
检查什么?
#!/usr/bin/env bash
if [[ $VAR =~ '^[0-9]+$' ]]; then
execute code
fi
答案1
正则表达式^[0-9]+$
将匹配非空的连续数字字符串,即仅由数字组成的非空行。如果您想在 3.2 或更高版本中使用该正则表达式[[ ... =~ there ]]
,bash
那么您也应该将其不加引号,即^[0-9]+$
代替'^[0-9]+$'
.您的代码片段可能应该如下所示:
#!/usr/bin/env bash
if [[ "${VAR}" =~ ^[0-9]+$ ]]; then
#execute code
fi
答案2
当 VAR 从开始 (^) 到结束 ($) 匹配一个或多个 (+) 数字 [0-9] 时,正则表达式将匹配 VAR 的内容。该行必须仅包含数字才能匹配 [0-9]+ 两端的 ^ 和 $。
用于测试 if 正则表达式与一系列输入的比较的程序
$ cat flub
#!/usr/bin/bash
for VAR in 3a3 '^[0-9]+$' 2 1919181818 flub 282_2828 '38938 2828' '3939.' '.3939'
do
echo -n "Testing $VAR : "
if [[ "$VAR" =~ ^[0-9]+$ ]]; then
echo "$VAR" matches
else
echo
fi
done
输出
$ ./flub
Testing 3a3 :
Testing ^[0-9]+$ :
Testing 2 : 2 matches
Testing 1919181818 : 1919181818 matches
Testing flub :
Testing 282_2828 :
Testing 38938 2828 :
Testing 3939. :
Testing .3939 :
而用单引号引起来的扩展正则表达式部分仅匹配文字字符串:
$ cat flub
#!/usr/bin/bash
for VAR in 3a3 '^[0-9]+$' 2 1919181818 flub 282_2828 '38938 2828' '3939.' '.3939'
do
echo -n "Testing $VAR : "
if [[ "$VAR" =~ '^[0-9]+$' ]]; then
echo "$VAR" matches
else
echo
fi
done
$ ./flub
Testing 3a3 :
Testing ^[0-9]+$ : ^[0-9]+$ matches
Testing 2 :
Testing 1919181818 :
Testing flub :
Testing 282_2828 :
Testing 38938 2828 :
Testing 3939. :
Testing .3939 :
答案3
测试是测试是否$VAR
包含字符串^[0-9]+$
。要测试$VAR
正则表达式^[0-9]+$
,请删除引号。
如果正则表达式匹配,则测试为 true。如果字符串 in$VAR
只包含数字(并且至少一数字)。
进行相同测试的另一种方法是使用case
(这将使其可移植到除 之外的其他 shell bash
):
case "$VAR" in
*[!0-9]*)
# string has non-digits
;;
*[0-9]*)
# string has at least one digit
# (and no non-digits because that has already been tested)
;;
*)
# string must be empty due to the previous two tests failing
esac
答案4
如果您不确定正则表达式的含义,请使用众多在线工具之一。它们准确地告诉您表达式的哪一部分执行什么操作,甚至在示例中显示匹配项。
这是一个例子https://regex101.com/(还有其他很棒的网站):