Bash 正则表达式匹配点和字符

Nic*_*ick 3 regex bash shell

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

我当前使用的模式是:

name\":\"(\.[a-zA-Z]+)\"
Run Code Online (Sandbox Code Playgroud)

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

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

干杯。

3ch*_*eel 5

我最近在根据我的 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". 
Run Code Online (Sandbox Code Playgroud)

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

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

我原以为它能正常工作,但结果根本不匹配。

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

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

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

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