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