2017-01-04 10 views
4

正規表現パターンの最後の一致をどのように一致させることができますか?例えばRegex、最後のペアに一致

、私は[XXX]を一致させることができる方法:X、XX、XXXはランダムに割り当てることができる

data[X][XX][XXX] 

私はすでに否定先読み

\[.*?\](?!.*?\[.*?\]) 

を使用しようとしたが、[最後付き]最初は、正しい結果が得られないだろうか照合されます。

答えて

5

このような結果が得られる理由は、.[]および改行文字以外の任意の文字と一致するためです。あなたは否定文字クラス[^][]と怠惰なドットを置き換えることがあります。

\[[^][]*\](?!.*?\[[^][]*\]) 

は、正規表現の風味によってregex demo

を参照してください、あなたは文字クラスに[]をエスケープする必要があるかもしれません(JS、]に([^\][])、Java/ICUでは両方をエスケープする必要があります([^\]\[]))。

+1

もう一つの解決法は、あなたが '[...]'の中に ']'を持つことができる場合に便利です:['\ [[^ [] * \](?!。*?\ [[^ [] * \] ) '](https://regex101.com/r/EWVifZ/2)。また、複数行の入力がある場合は、 '。*?'を '[\ s \ S] *? 'に置き換えてください。 –

0

あなたは簡単にするためにこれを試すことができます。

.*(\[.*\]) 

それは最後のoccurance件まで一致しますが、グループ1に[anything]の最後の発生をキャプチャしますと、今後の

Explanation

を見てする必要はありません
+0

私は、このパターンを1つの条件の下で掘り下げたいと考えています。入力文字列は短いとわかっています。最後の '[...]'の任意の場所に長い入力があると、最初の '。*'はパフォーマンスの問題を引き起こす可能性があります。 –