[編集:私はキャプチャグループに関する情報についてこの投稿を残しましたが、私が与えた主な解決策は正しくありませんでした。
(?:START)((?:[^S]|S[^T]|ST[^A]|STA[^R]|STAR[^T])*)(?:END)
コメントで指摘されているように機能しませんでした。私は、無視された文字が削除されないことを忘れていたので、あなたは... |STA(?![^R])|
のようなものが必要になりますが、その文字はENDの一部であるため、STARTSTAENDなどでは失敗します。それは明らかに良い選択です。キャプチャグループを使用する適切な方法を以下に示す必要があります...]
キャプチャグループを持つ「ゼロ幅ネガティブ先読み」演算子「?!」を使用して得られた答えは、(?:START)((?!.*START).*)(?:END)
です。内部テキストをキャプチャします置き換えに$ 1を使用します。 STARTタグとENDタグを取得したい場合は、(START)((?!.*START).*)(END)
を実行して、$ 1 = START $ 2 = textと$ 3 = END、またはまたは?:
を追加/削除することで、さまざまな順列を与えることができます。
このようにして検索や置換を行う場合は、BEGIN $ 1FINISHのようにすることができます。だから、あなたが開始した場合:
abcSTARTdefBEGINghiFINISHjkl
あなたを許す
:
abcSTARTdefSTARTghiENDjkl
あなたはキャプチャグループ1としてghi
になるだろう、として交換はあなたに次を与えるだろう$ 1FINISHをBEGIN START/ENDトークンを正しくペアにした場合にのみ変更できます。
各(x)
はグループですが、私は(?:x)
を非捕捉グループとしてマークする中間を除いてそれぞれに入れました。私が?:
なしで去った唯一の人は中央でした。しかし、BEGIN/ENDトークンをキャプチャすることも考えられます。
Java正規表現の詳細については、Java regex documentationを参照してください。
テキストが 'abcSTARTabcENDabcSTARTabcENDabc'の場合はどうなりますか?両方の試合が欲しいですか? –
それについては考えていませんでした...とにかく、必要に応じて2番目の試合を見つけることができます。 – rrr
これを単一の正規表現で行う方がよいでしょう。私は答えを加えました。 –