Я не парень по Java, поэтому мои ответы основаны на реализации .NET Regex. Я использовал
"(?<=(^.*)\\G.*)(?<=\\G\\1.)"
исходя из того, что \sum_{i=0}^{n} 2^n = 2^{n+1} - 1
. Он в основном гласит: «Сопоставить каждую позицию, для которой деталь после последнего совпадения на единицу длиннее, чем деталь перед последним совпадением».
Это примерно в два раза быстрее, чем ваш оригинал (опять же в .NET), на разделение 10.000 символов уходит менее 2 секунд, и я бы сказал, что он немного более читабелен. Ну ... менее нечитабельно. =)
Ура! Хороший вопрос! =)
Редактировать: Снова глядя на свое регулярное выражение, мне кажется, что вы используете тот же подход, но более сложным образом. Я признаю, что я не пытался прочитать ваше, прежде чем пытаться найти свое собственное решение, и потому, что мне нравится вызов, и потому что ваше регулярное выражение совершенно нечитаемо. знак равно
Являются ли эти вложенные обходные пути необходимыми из-за механизма регулярных выражений Java?