这个问题与这里的任何其他问题都不重复,因为我regex
需要bash
匹配=~
。
假设我有一个像这样的字符串
string="ananas1kiwi2apple1banana2tree"
我regEx
尝试的是
[[ $string =~ .*2([[:alnum:]]{1,}) ]] && subString=${BASH_REMATCH[1]}
它应该匹配 的出现2
并捕获除此之外的所有内容,它仅返回我tree
(第二次匹配后的字符串)。我的预期输出是apple1banana2tree
我知道缺少一个简单的构造,但不确定是哪个。我只寻找bash
regEx
基于纯的解决方案。我知道也没有任何字符串操作可以通过"{string#*2}"
答案1
只需匹配2
,然后通过以下方式捕获之外的所有内容.*
:
[[ $string =~ 2(.*) ]] && echo "${BASH_REMATCH[1]}"
例子:
$ string="ananas1kiwi2apple1banana2tree"
$ [[ $string =~ 2(.*) ]] && echo "${BASH_REMATCH[1]}"
apple1banana2tree
你的有什么问题:
.*
2
是贪婪的,当您使用 时,它会匹配到最后一个.*2
,以具有非贪婪性(.*?
在 ERE 中不可用)使用[^2]*2
也
{1,}
只是+
所以这样做:
[[ $string =~ [^2]*2([[:alnum:]]+) ]]
无论如何,不需要从一开始就匹配,只需执行以下操作:
[[ $string =~ 2([[:alnum:]]+) ]]