concuncan:
私は仕事にこれを取得するために二日間苦労してきたが、私はちょうど(私は正規表現でひどいよ:S)することはできません。
${test}[arg]
このテキストから、私は2つの異なるものを取得する必要がありますtest
とarg
。これを行うには、私は、この正規表現を作成しました:
(\$\{(\b[a-zA-Z0-9.]+\b)\})(\[(.+)\])?
この例では、それが動作します。私はこの他のテキストをしようとした場合しかし、: ${test}[arg1] - ${test2}[arg2]
、私はちょうど2基で一試合を取得する:test
とarg1] - ${test2}[arg2
、代わりに2つの異なる試合得ることの:グループでの1 test
とarg1
し、グループと他test2
とをarg2
。
私はあなたが私を助けることができると思います。
前もって感謝します。
UnbearableLightness:
これは、なぜ古典的な例である.+
組み合わせは悪することができます。代わりに否定文字セットを使用します。
(\$\{(\b[a-zA-Z0-9]+\b)\})(\[([^]]+)\])
^^^
あなたはそれを試すことができますここに。
二つの表現の振る舞いを比較します。
貪欲に何かを一致させます。第二試合のために、正規表現は貪欲に何もマッチします。それは、文字列の末尾に到達するまで何も一致し、それが見つかるまでバックトラックする必要があります
]
。すぐに見つかったとして]
、それが停止し、したがって、あなたが終わる[arg1] - ${test2}[arg2]
試合など。何が、一致
]
。ここでは正規表現ではない何かをマッチングされ]
、したがって、すべてのステップで、次があるかどうかをチェックしている]
かではありません。第二試合のために、あなたはできるだけ早くそれが見つかったとして、それを見ることができる]
、それが停止します。