3

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

我目前使用的模式是:

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

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

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

干杯。

4

3 回答 3

4

我最近在我的脚本中遇到了这个问题,该脚本根据我的 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". 

有一天,我创建了一个包含 a 的分支,.发现我的 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". 

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

于 2017-05-19T15:16:39.640 回答
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
于 2013-03-05T15:17:18.317 回答
0

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

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

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

\"name\":\"([a-zA-Z.@]+)\"
于 2013-03-05T14:51:08.840 回答