正規表現のキャプチャグループは、意図したとおりに動作しません

concuncan:

私は仕事にこれを取得するために二日間苦労してきたが、私はちょうど(私は正規表現でひどいよ:S)することはできません。

${test}[arg]

このテキストから、私は2つの異なるものを取得する必要がありますtestargこれを行うには、私は、この正規表現を作成しました:

(\$\{(\b[a-zA-Z0-9.]+\b)\})(\[(.+)\])?

この例では、それが動作します。私はこの他のテキストをしようとした場合しかし、: ${test}[arg1] - ${test2}[arg2]私はちょうど2基で一試合を取得する:testarg1] - ${test2}[arg2、代わりに2つの異なる試合得ることの:グループでの1 testarg1し、グループと他test2とをarg2

私はあなたが私を助けることができると思います。

前もって感謝します。

UnbearableLightness:

これは、なぜ古典的な例である.+組み合わせは悪することができます。代わりに否定文字セットを使用します。

(\$\{(\b[a-zA-Z0-9]+\b)\})(\[([^]]+)\])
                              ^^^

あなたはそれを試すことができますここに


二つの表現の振る舞いを比較します。

  • 貪欲に何かを一致させます第二試合のために、正規表現は貪欲に何もマッチします。それは、文字列の末尾に到達するまで何も一致し、それが見つかるまでバックトラックする必要があります]すぐに見つかったとして]、それが停止し、したがって、あなたが終わる[arg1] - ${test2}[arg2]試合など。

  • 何が、一致]ここでは正規表現ではない何かをマッチングされ]、したがって、すべてのステップで、次があるかどうかをチェックしている]かではありません。第二試合のために、あなたはできるだけ早くそれが見つかったとして、それを見ることができる]、それが停止します。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=209928&siteId=1