Хороший! Я не вижу способа значительно улучшить это регулярное выражение, хотя я бы реорганизовал его, чтобы избежать ненужного использования негативной логики:
".(?=.{N})|.(?=.*(?<=(.{N})))"
Таким образом, вторая альтернатива никогда не будет введена, пока вы не достигнете последних N символов, что, я думаю, делает смысл немного более ясным.
Я никогда не видел упоминаний, в которых говорилось бы, что все в порядке, но, как и Барт, я не понимаю, почему это не так. Иногда я использую lookaheads внутри lookbehinds, чтобы обойти ограничения для выражений lookbehind переменной длины.
РЕДАКТИРОВАТЬ: Я только что понял, что могу немного упростить регулярное выражение, поместив чередование в поле зрения:
".(?=.{N}|.*(?<=(.{N})))"
Кстати, вы рассматривали возможность использования format()
для построения регулярного выражения вместо replace()
?
return str.replaceAll(
String.format(".(?=.{%1$d}|.*(?<=(.{%1$d})))", N),
"$1"
);