【问题标题】:Regular expression for positive integer [duplicate]正整数的正则表达式
【发布时间】:2016-12-17 15:26:49
【问题描述】:

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

【问题讨论】:

  • “正整数”不够具体。前导零可能是合法的,尤其是在以 base-8 指定文字时。领先的+ 合法吗?最后,== 不执行正则表达式匹配;它执行 pattern 匹配。
  • ^[1-9][0-9]*$ 不起作用:/
  • 前导0不合法

标签: regex bash shell


【解决方案1】:

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

您可以使用 extended 模式匹配,它可以显式启用,或者(在 bash 的较新版本的情况下)假定为 == 和 @ 的参数启用987654326@.

shopt -s extglob  # may not be necessary
if [[ $myvar == [1-9]*([0-9]) ]]; then

模式*([0-9]) 将匹配括号中的模式出现的零次或多次。


如果您想改用正则表达式,请使用=~ 运算符。请注意,您现在需要将正则表达式锚定到要匹配的字符串的开头和结尾;模式会自动这样做。

if [[ $myvar =~ ^[0-9][1-9]*$ ]]; then

请注意,一些混淆源于 [...] 既是合法的正则表达式 模式这一事实,并且像 * 这样的字符在两者中都使用了,但含义略有不同。另请注意,扩展模式在功能上与正则表达式等效(任何你可以匹配一个你可以匹配另一个的),但我把证明留给读者作为练习。

【讨论】:

  • if [[ $myvar == [1-9]+([0-9]) ]]; then 似乎不适用于[1,9]if [[ $myvar == [1-9]*([0-9]) ]]; then 我认为可以。谢谢
  • 啊,对不起。如果您允许数字以 0 开头,您可以简单地使用+([0-9]),我想我在写答案时已经想到了这一点。在您的情况下,您确实想改用*
【解决方案2】:

无需使用正则表达式来检查正整数。就像这样(( ... )) 构造:

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

【讨论】:

  • 假设输入是某种类型的整数。
  • 恐怕这会给像 12.45 这样的值带来误报
  • @sjsam 不,不会。 isInt '12.45' 将打印 nope
  • @chepner:没有假设。传递的参数是否为正整数。
  • 如果您将foo 作为参数传递,并且有一个名为foo 且整数值大于0 的全局变量,isInt foo 将返回true。 foo 不是正整数,尽管它的 是。这可能没问题,但这与所述问题不一致; 字符串 foo 肯定不是正整数。
【解决方案3】:
[[ $myvar =~ ^[+]*[[:digit:]]*$ ]] && echo "Positive Integer"

不应该这样做吗?

如果0 在您的描述中不是正数,并且您还没有准备好接受前导零或加号,那么就这样做

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

【讨论】:

  • 没有。首先它在变量为 0 时打印 Pos 整数并且还接受以 0 开头的变量...
  • @adikinzor : 是领先的+legal 吗?
  • @adikinzor :我进行了编辑。
猜你喜欢
  • 1970-01-01
  • 2013-05-22
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多