【问题标题】:Bash regex to match dots and charactersBash 正则表达式以匹配点和字符
【发布时间】:2013-03-05 14:47:02
【问题描述】:

我正在尝试使用 =~ 运算符针对 curl 响应字符串执行正则表达式模式。

我当前使用的模式是:

name\":\"(\.[a-zA-Z]+)\"

然而,目前此模式仅提取仅包含字符 a-z 和 A-Z 的值。我需要这种模式来获取包含“。”的值。字符和“@”字符。我该怎么做?

另外,这种模式有什么方法可以提高性能吗?对字符串执行需要很长时间。

干杯。

【问题讨论】:

  • 更有用的是查看您如何在代码中使用该模式。

标签: regex bash shell


【解决方案1】:

我最近在我的脚本中遇到了这个问题,该脚本根据我的 git 状态设置我的 bash 提示符,发现这是因为我想在表达式中匹配的其他东西(即连字符)的位置。

例如,我想匹配 git status 输出的某个部分,例如上面写着"Your branch is ahead of 'origin/mybranch' by 1 commit."

这是我最初的模式:

"Your branch is (ahead of|behind) '([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)' by ([0-9]+) commit". 

有一天我创建了一个包含. 的分支,发现我的 bash 提示符没有显示正确的内容,并将表达式修改为以下内容:

"Your branch is (ahead of|behind) '([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-.]+)' by ([0-9]+) commit". 

我希望它可以正常工作,但根本没有匹配。

看了很多帖子,才发现是因为连字符的位置(-);我必须把它放在第一个方括号之后,否则它会被解释为一个范围(在这种情况下,它试图解释 _-. 的范围,这是无效的,或者只是以某种方式使整个表达式崩溃。

当我将表达式更改为以下内容时它开始工作:

"Your branch is (ahead of|behind) '([a-zA-Z0-9_-]+)/([-a-zA-Z0-9_.]+)' by ([0-9]+) commit". 

所以基本上我的意思是说它可能是你的表达中的其他东西(比如我的连字符)干扰点和&符号的匹配。

【讨论】:

    【解决方案2】:

    工作示例脚本:

    #!/bin/bash
    regex='"name":"([a-zA-Z.@]+)"'
    input='"name":"internal.action.retry.queue@temp"'
    
    if [[ $input =~ $regex ]]
    then
        echo "$input matches regex $regex"
        for (( i=0; i<${#BASH_REMATCH[@]}; i++))
        do
            echo -e "\tGroup[$i]: ${BASH_REMATCH[$i]}"
        done
    else
        echo "$input does not match regex $regex"
    fi
    

    【讨论】:

    • 嗯,这对我也不起作用。正则表达式执行的示例字符串是:pastebin.com/j3edCZtQ。这是卷曲的输出
    • 您是否将我的脚本复制并粘贴到文件中并运行它?它对我有用。
    【解决方案3】:

    只需添加点 ('.') 和 at 符号 ('@'):

    name\":\"(\.[a-zA-Z.@]+)\"
    

    如果您不需要 URL 开头的强制点,请使用:

    \"name\":\"([a-zA-Z.@]+)\"
    

    【讨论】:

    • 嗯,这似乎不再匹配:示例字符串是...“name”:“internal.action.retry.queue@temp”我需要匹配 internal.action.retry。 queue@temp
    • @Nick 哦。我认为\. 是有原因的。添加了没有额外点的变体。
    猜你喜欢
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多