Я хотел бы использовать разделитель, такие как
String delimiter = "[a-zA-Z]{1,4}[0-9]{1,4}";
Тогда сделайте как в lookahead
и lookbehind
для того, чтобы захватить разделитель, а также маркер, которые вы хотите разделить.
//Lookahead and lookbehind where %1 is the delimiter
String WITH_DELIMITER = "((?<=%1$s)|(?=%1$s))";
String regex = String.format(WITH_DELIMITER, delimiter);
Так как кажется, группа захвата разделяет момент регулярное выражение сопоставляются
Пример: A15
разбивается на A
1
и 5
Вы должны перебрать свои маркера для конкатенации этих маркеров, на самом деле являются разделителями (с использованием другого брака)
String matcher = "[a-zA-Z]*[0-9]+";
String[] s = text.split(regex);
List<String> result = new ArrayList<>();
String tmp = "";
for (String x : s) {
if (x.matches(matcher)) {
tmp += x;
} else {
if (!tmp.isEmpty()) {
result.add(tmp);
tmp = "";
}
result.add(x);
}
}
if(!tmp.isEmpty()) {
result.add(tmp);
}
Собираем все вместе:
public static List<String> splitWithDelimiter(String text, String delimiter) {
String WITH_DELIMITER = "((?<=%1$s)|(?=%1$s))";
String regex = String.format(WITH_DELIMITER, delimiter);
String matcher = "[a-zA-Z]*[0-9]+";
String[] s = text.split(regex);
List<String> result = new ArrayList<>();
String tmp = "";
for (String x : s) {
if (x.matches(matcher)) {
tmp += x;
} else {
if (!tmp.isEmpty()) {
result.add(tmp);
tmp = "";
}
result.add(x);
}
}
if(!tmp.isEmpty()) {
result.add(tmp);
}
return result;
}
public static void main(String[] args) {
String test = "=(7+A185)-5";
String delimiter = "[a-zA-Z]{1,4}[0-9]{1,4}";
List<String> s = splitWithDelimiter(test, delimiter);
for (String x : s) {
System.out.println(x);
}
}
Какие выходы:
=(7+
A185
)-5
'[Az]' включает символы ' '[', '\\', ']', '^',«_ ', 'и' '\' ''. Нет смысла обматывать строку в 'new String (" foo ")'. –
Каков диапазон буквенно-цифровых маркеров (из вашего регулярного выражения будет видно, что вы ищете от 1 до 4 {1,4} за альфа и {1,4} за числовые. Будет ли ABCD1234 действительным, но ABCDEF12345 NOT? – gtgaxiola
Точно , ABCD1234 действительно, в то время как ABCDEF ... не – Naouk