В конце вы должны вынуть +
, так как вы хотите извлечь их по одному.
Все это в скобках, это будет группа 1, либо сделать его несовпадающих группу (с ?:
) или начать с 2. Удаление скобок не будет работать из-за добавления +
в следующем регулярном выражении (см. код).
matcher.matches
проверяет всю строку, которая не будет работать с регулярным выражением без +
, для этого вам, вероятно, потребуется исходное регулярное выражение.
Кроме того, с помощью matches
и затем find
на том же Matcher
не будет работать, так как matches
будет перемещать текущую позицию в строке, таким образом, если они совпадают, то это будет в конце строки. Таким образом, find
ничего не найдет, так как для поиска нет строки. Вы можете использовать reset
на Matcher
, чтобы сбросить его положение, но это, очевидно, не решит вышеуказанные проблемы.
Обновленный код:
private static void products(final String products) {
final String regex = "(?:\\{([0-9]+),([0-9]+)\\})";
// validation
final Pattern pAll = Pattern.compile(regex + "+");
if (!pAll.matcher(products).matches()) {
throw new IllegalArgumentException("Wrong semantic of products!");
}
// extraction
final Pattern p = Pattern.compile(regex);
final Matcher matcher = p.matcher(products);
while (matcher.find()) {
System.out.print(matcher.group(1) + " ");
System.out.println(matcher.group(2));
}
}
Test.
Для тех, кто заинтересован, вот способ сделать это в 1 проход: (matches
проходит через всю строку, таким образом, в результате чего 2 проходит через строку)
private static void products(final String products) {
final String regex = "\\{([0-9]+),([0-9]+)\\}";
final Pattern p = Pattern.compile(regex);
final Matcher matcher = p.matcher(products);
int lastEnd = 0;
while (matcher.find()) {
if (lastEnd != matcher.start())
throw new IllegalArgumentException("Wrong semantic of products!");
System.out.print(matcher.group(1) + " ");
System.out.println(matcher.group(2));
lastEnd = matcher.end();
}
if (lastEnd != products.length())
throw new IllegalArgumentException("Wrong semantic of products!");
}
Единственным недостатком является то, что он будет печатать выведите все значения до поиска неверных данных.
Например, products("{1,3}{4,5}a{6,7}");
напечатает:
1 3
4 5
перед бросать исключение (так как до, пока строка не действует).
В чем проблема? – Andremoniy
Это регулярное выражение "(\\ {([0-9] +), ([0-9] +) \\}) +" не работает для нахождения цифр в строке. – MAGx2
@Andremoniy Это не работает ... – vikingsteve