我尝试使用 =〜运算符对curl响应字符串执行正则表达式模式。
我目前使用的模式是:
name\":\"(\.[a-zA-Z]+)\"
目前,此模式仅提取仅包含字符a-z和A-Z的值。我需要这个模式来获取包含'的值。'角色和' @'字符。我该怎么做?
此外,有没有什么方法可以改善这种模式的性能?执行该字符串需要相当长的时间。
干杯。
答案 0 :(得分: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
答案 1 :(得分: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 :(得分:0)
只需添加点('。')和符号('@'):
name\":\"(\.[a-zA-Z.@]+)\"
如果您不想在URL的beginnig处使用强制点,请使用:
\"name\":\"([a-zA-Z.@]+)\"