【问题标题】:Bash regex for certain number length特定数字长度的 Bash 正则表达式
【发布时间】:2018-07-26 10:47:33
【问题描述】:

所以我试图识别作为参数输入到我的脚本中的两组数字。一个是电话号码,一个是打印 mongodb 日志的限制。我能想到的最简单的方法是,如果数字超过 7 位,它很可能是一个电话号码,因为打印 mongo 结果太长是不太可能的。

我正在尝试将其放入案例陈述中

case "$1" in

 regex here ) echo "not msisdn";;

 regex here ) echo "msisdn";;

 *) echo "not found";;

esac

我正在考虑将其转换为字符串并检查长度可能是最简单的,因为我似乎找不到任何关于如何查找输入的位数的合适信息。

编辑:我应该注意我正在考虑将所有这些都放在 if 语句中,但这些不是我要检查的唯一情况,而且我认为 if 语句会变得非常冗长。我正在创建的脚本已经大部分是 ifs,所以尝试对其进行一些更改。让我知道我是否错了。

【问题讨论】:

    标签: regex bash


    【解决方案1】:

    ${#1} 包含$1 的长度。所以也许只是

    if (( ${#1} > 7 )) ; then
        echo Phone number
    else
        echo Too short for a phone number
    fi
    

    【讨论】:

    • 这是我最初想做的事情,但我还在学习 bash 并且我的脚本已经有大量的 ifs。想稍微改一下。我将有多个其他参数,我希望它们可以互换,这样它们就可以按任何顺序输入,或者在不需要时省略。我认为使用 ifs 会使这变得非常混乱。
    【解决方案2】:

    case 不支持正则表达式;通配符语法是一种能力较差的形式,称为 glob 模式 1

    case $1 in
      *[!0-9]*)
        echo "Not a number";;
      ? | ?? | ??? | ???? | ????? | ??????)
        echo "Six digits or less";;
      '')
        echo "Empty string";;
      *)
        echo "Seven digits or more";;
    esac
    

    目前尚不清楚是否应单独处理非数字或空输入,但希望这至少可以帮助您入门。


    1 有些人会争辩说,glob 是一种严格受限的正则表达式。我当然不同意,因为这比恕我直言更令人困惑——几个元字符具有完全不同的语义,剩下的相似之处主要是静态部分,而不是实际有用的模式。

    【讨论】:

    • 太完美了,谢谢!不知道glob。会调查更多。
    猜你喜欢
    • 2011-06-17
    • 1970-01-01
    • 2012-03-27
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    相关资源
    最近更新 更多