この質問は一致する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
欲張り(EREでは使用できません)を使用する.*2
には、使用時に最後の項目と一致します。.*?
[^2]*2
それ
{1,}
だけ+
これを行う:
[[ $string =~ [^2]*2([[:alnum:]]+) ]]
とにかく最初から一致させる必要はありません。以下を行います。
[[ $string =~ 2([[:alnum:]]+) ]]