Примечание : этот ответ основан на более ранней редакции вопроса
В Java, я думаю, что-то вроде этого - то, что вы хотите:
String[] tests = {
"One Two 1 & 2",
"Boeing 737 2, 4 & 6",
"Lucky 7",
"MI6 agent 007, 006",
"2010-05 26, 27 & 28"
};
for (String test : tests) {
String[] parts = test.split("(?=\\d+(, \\d+)*( & \\d+)?$)", 2);
for (String number : parts[1].split("\\D+")) {
System.out.println(parts[0] + number);
}
}
Это печатает: ( как видно на ideone.com )
One Two 1
One Two 2
Boeing 737 2
Boeing 737 4
Boeing 737 6
Lucky 7
MI6 agent 007
MI6 agent 006
2010-05 26
2010-05 27
2010-05 28
По сути, мы используем lookahead, чтобы разделить, где начинается специальная числовая последовательность, ограничивая разделение на 2 части. Затем последовательность специальных номеров разбивается на любую последовательность, не состоящую из цифр \D+
.
Шаблон для последовательности специальных номеров, как показано на рисунке ниже:
\d+(, \d+)*( & \d+)?$
API ссылки
String[] split(String regex, int limit)
- Параметр
limit
определяет количество применений шаблона и, следовательно, влияет на длину результирующего массива. Если предел n
больше нуля, то шаблон будет применен не более n - 1
раз, длина массива не будет превышать n
, а последняя запись массива будет содержать все входные данные за пределами последнего сопоставленного разделителя.
Смотри также
Одно replaceAll
решение
Если по какой-либо причине вы настаиваете сделать это одним махом replaceAll
, вы можете написать что-то вроде этого:
String[] tests = {
"One Two 1 & 2",
"Boeing 737 2, 4 & 6",
"Lucky 7",
"MI6 agent 007, 006",
"2010-05 26, 27 & 28",
};
String sequence = "\\d+(?:, \\d+)*(?: & \\d+)?$";
for (String test : tests) {
System.out.println(
test.replaceAll(
"^.*?(?=sequence)|(?<=(?=(.*?)(?=sequence))^.*)(\\d+)(\\D+)?"
.replace("sequence", sequence),
"$1$2$3"
)
);
}
Вывод ( как видно на ideone.com ):
One Two 1 & One Two 2
Boeing 737 2, Boeing 737 4 & Boeing 737 6
Lucky 7
MI6 agent 007, MI6 agent 006
2010-05 26, 2010-05 27 & 2010-05 28
При этом используются тройные вложенные утверждения, в том числе заглядывание за конечной бесконечной длины в Java. Я не рекомендовал бы использовать это, но там это есть.