“^[0-9]+$”的含义?

“^[0-9]+$”的含义?

这个表达式模式'^[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/(还有其他很棒的网站): 正则表达式

相关内容