regex
各文字の3番目、4番目、...の出現に一致するパターンを探しています。明確にするために以下を見てください:
たとえば、次の文字列があります。
111aabbccxccybbzaa1
2回目以降の重複文字をすべて置き換えたい。出力は次のようになります。
11-aabbccx--y--z---
これまでに試したいくつかの正規表現パターン:
次の正規表現を使用して、各文字の最後の出現を見つけることができます。 (.)(?=.*\1)
または、これを使用して、連続する重複に対してそれを行うことができますが、重複に対してはできません: ([a-zA-Z1-9])\1{2,}
1
どの正規表現エンジンを正規表現で使用する予定ですか?
—
WiktorStribiżew19年
無限幅の後読みをサポートする正規表現でのみそれを行うことができるため、その場合の唯一のオプションはPython PyPi正規表現モジュールです。
—
WiktorStribiżew19年
(.)(?<=^(?:(?:(?!\1).)*\1){2,}(?:(?!\1).)*\1)
正規表現で使用します。デモ。
@WiktorStribiżewそれ以上
—
Stefan Pochmann、
(.)(?<=(.*\1){3})
ですか?
@StefanPochmannまあ、それでもうまく
—
WiktorStribiżew19年
(.)(?<=(?:.*\1){3})
いきますが、過度のバックトラックが長い文字列で問題を引き起こす可能性があるため、これらすべては適切ではありません。問題を解決するために、正規表現ではないメソッドを作成したいと思います。
@WiktorStribiżewテスト文字列をregexstormに数回コピーして巨大な文字列にすると、パターンに750ミリ秒、
—
ボブルバブル
(.)(?<=(?:.*\1){3})
25ミリ秒、3 (.)(?<=(?:\1.*?){2}\1)
ミリ秒などのパフォーマンスの違いが生じます。自分でテストできます。あなたのパターンは最も効率の悪いパターンのようで、読むのが最も難しいです。