正整数的正则表达式

时间:2016-12-17 15:26:49

标签: regex bash shell

正整数的正则表达式是什么?我在if脚本的bash子句中需要它,我尝试[[ $myvar == [1-9][0-9]* ]]但我不明白为什么它说,例如,6不是整数而{{1是的。

3 个答案:

答案 0 :(得分:2)

==运算符执行模式匹配,而不是正则表达式匹配。 [1-9][0-9]*匹配以1-9开头的字符串,后跟0-9范围内的数字,后跟任何,包括空字符串。 *不是运算符,而是通配符。因此,基本模式匹配是不够的。

您可以使用扩展模式匹配,可以显式启用,或者(在较新版本的bash的情况下)假定为{{1的参数启用}和==

!=

模式shopt -s extglob # may not be necessary if [[ $myvar == [1-9]*([0-9]) ]]; then 将匹配括号中包含的模式的零次或多次。

如果您想使用正则表达式,请使用*([0-9])运算符。请注意,您现在需要将正则表达式锚定到要匹配的字符串的开头和结尾;模式会自动完成。

=~

请注意,一些混淆源于if [[ $myvar =~ ^[0-9][1-9]*$ ]]; then 既是合法的正则表达式模式,而[...]这两个字符同时用于*。意思略有不同。另请注意,扩展模式与正则表达式相当(任何可以匹配的模式都与其他模式匹配),但我将此证明作为练习留给读者。

答案 1 :(得分:1)

[[ $myvar =~ ^[+]*[[:digit:]]*$ ]] && echo "Positive Integer"

不应该这样做吗?

如果您的说明中的0不是正数,而您尚未准备好接受前导零或加号,那么请执行

[[ $myvar =~ ^[1-9]+[[:digit:]]*$ ]] && echo "Positive Integer"

答案 2 :(得分:1)

无需使用正则表达式来检查正整数。只需(( ... ))构建如下:

isInt() {
   # do sanity check for argument if needed 
   local n="$1"
   [[ $n == [1-9]* && $n -gt 0 ]] 2>/dev/null && echo '+ve integer' || echo 'nope'
}

然后将其用作:

isInt '-123'
nope

isInt 'abc'
nope

isInt '.123'
nope

isInt '0'
nope

isInt '789'
+ve integer

isInt '0123'
nope

foo=1234
isInt 'foo'
nope