最初の区切り文字の後の文字列を抽出するbashの正規表現

最初の区切り文字の後の文字列を抽出するbashの正規表現

この質問は一致するregex必要があるため、ここの他の質問と重複しません。bash=~

次のような文字列があるとしましょう。

string="ananas1kiwi2apple1banana2tree"

私がregEx試したことは

[[ $string =~ .*2([[:alnum:]]{1,}) ]] && subString=${BASH_REMATCH[1]}

発生した項目と一致し、それ以外のすべての項目をキャプチャする必要があります2tree私の予想結果は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:]]+) ]]

関連情報