Я пытаюсь понять регулярное выражение как можно больше, поэтому я придумал это решение на основе regex для codingbat.com repeatEnd
:
С учетом строки и int N верните строку из N повторений последних N символов строки. Вы можете предположить, что N находится между 0 и длиной строки, включительно.
public String repeatEnd(String str, int N) {
return str.replaceAll(
".(?!.{N})(?=.*(?<=(.{N})))|."
.replace("N", Integer.toString(N)),
"$1"
);
}
Объяснение по его частям:
-
.(?!.{N})
: утверждает, что совпадающий символ является одним из последних N символов, убедившись, что за ним не осталось N символов. -
(?=.*(?<=(.{N})))
: в этом случае используйте lookforward, чтобы сначала пройти весь путь до конца строки, затем вложенный lookbehind, чтобы захватить последние N символов в\1
. Обратите внимание, что это утверждение всегда будет истинным. -
|.
: если первое утверждение не выполнено (т.е. впереди по крайней мере N символов), то в любом случае совпадение с символом;\1
будет пустым. -
В любом случае символ всегда сопоставляется; замените его на
\1
.
Мои вопросы:
- Является ли эта методика вложенными утверждениями действительными? (т.е. оглядываясь назад во время просмотра?)
- Есть ли более простое решение на основе регулярных выражений?
Бонусный вопрос
Do repeatBegin
(как аналогично определено).
Я честно испытываю проблемы с этим!