В качестве личного обучения упражнения, я написал это регулярное выражение, чтобы разделить унарную строку на части, длина которых увеличивается полномочия двух (see also on ideone.com):Regex оптимизация вопрос
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 "
Это использует комбинацию захвата во время lookarounds, вложенные образы, сопоставление на обратных ссылках и бесконечная длина lookbehind (которая официально не поддерживается на Java, но работает в любом случае). Также используются свойства сумм степеней двух и тот факт, что строка имеет унарный алфавит.
Это решение является нечитаемым и имеет ужасную производительность.
Мой вопрос: как бы вы «оптимизировали» это регулярное выражение?
- Можете ли вы сделать регулярное выражение более читаемым (это нормально, если он выполняет хуже)
- Можете ли вы сделать регулярное выражение выполняет лучше (это нормально, если это менее читаемыми)
Я считаю, играть с регулярными выражениями, чтобы быть весело, но это полностью мазохистски – Amarghosh
@Amargosh: было сложно печально писать, пока я не заработал. Затем он стал гедонистическим. – polygenelubricants
Насколько ужасно его производительность на Java? В .NET она разбивает 10-килограммовую буквенную строку в течение 4 секунд. – Jens