Надеюсь не разбить, если длина подстроки меньше 4
Другими словами, вы хотите иметь
предыдущий совпадение (разделение), разделенное на текущий совпадение, по крайней мере, с 4 символами, поэтому ABCKABKKABCD
будет разделяться на ABCK|ABKK|ABCD
, но не на `ABCK | АБК | .....
не менее 4 символов после текущего разбиения, поскольку ABCKAB
после разделения ABCK|AB
будет иметь AB
в конце, длина которого меньше 4.
Для достижения первого условия вы можете использовать \G
, которое представляет место предыдущего совпадения (или начало строки, если совпадений еще нет). Таким образом, первое условие может выглядеть как (?<=\G.{4,})
(ВНИМАНИЕ: обычно предварительный просмотр ожидает очевидную максимальную длину обработчика, который он обрабатывает, но по некоторым причинам здесь работает .{4,}
, что может быть ошибкой или добавлением функции в Java 10, которую я сейчас использую В случае, если он жалуется на это, вы можете использовать какое-то очень большое число, которое должно быть больше, чем максимальное количество символов, которое вы ожидаете между двумя разбиениями, например .{4,10000000}
)
Второе условие проще, поскольку оно просто (?=.{4})
.
Кстати, вы не хотите |
в [K|R]
, так как там он представляет литерал, а не оператор ИЛИ, поскольку по умолчанию любой символ в наборе символов является альтернативным выбором. Так что [K|R]
представляет K
ИЛИ |
ИЛИ R
. Вместо этого используйте [KR]
.
DEMO:
String text = "AYLAKPHKKKKKKDIVK123KAB";
String regex = "(?<=[KR])(?!P)(?<=\\G.{4,})(?=.{4})";
for (String s : text.split(regex)){
System.out.println("'"+s+"'");
}
Выход:
'AYLAKPHK'
'KKKK'
'KDIVK'
'123KAB'