個人的な学習課題として、単項文字列を長さが 2 のべき乗で増加する部分に分割するために、次の正規表現を作成しました ( ideone.com も参照)。
for (String s :
new String(new char[500])
.split("(?=(.*))(?<=(?<=(^.*))\\G.*)(?<=(?=\\2\\2.\\1)^.*)")
) {
System.out.printf("%s ", s.length());
}
// prints "1 2 4 8 16 32 64 128 245 "
これは、ルックアラウンド中のキャプチャ、ネストされたルックアラウンド、後方参照でのマッチング、および無限長の後読み (Java では公式にサポートされていませんが、とにかく動作します) の組み合わせを使用します。2 のべき乗の合計のプロパティと、文字列に単項アルファベットがあるという事実も利用されます。
このソリューションは判読不能であり、パフォーマンスも最悪です。
私の質問は、この正規表現をどのように「最適化」しますか?
- 正規表現を読みやすくできますか (パフォーマンスが悪くても問題ありません)
- 正規表現のパフォーマンスを向上させることはできますか (読みにくくても構いません)