Давайте посмотрим, что вы здесь делаете.
String string = "0_Beginning";
Pattern p = Pattern.compile( "^(\\d+)(?=_.*)" );
Вы объявляете и инициализируете объекты String и pattern.
String digit = string.replaceFirst( p.toString(), "$1" ); // To get the digit
(Вы преобразуете шаблон обратно в строку, иreplaceFirst создает новый шаблон из этого. Это преднамеренно?)
Как говорит Говард, это заменяет первое совпадение шаблона в строке содержимым первой группы, и совпадение шаблона просто0
здесь, как первая группа.Таким образом, digit
равно string
, ...
Integer oneMore = Integer.parseInt( digit ) + 1; // Evaluate ++digit
... и здесь ваш анализ не удастся.
string.replaceFirst( p.toString(), oneMore.toString() ); //
Это будет работать (но преобразовать шаблон сновав строку и обратно в шаблон).
Вот как бы я это сделал:
String string = "0_Beginning";
Pattern p = Pattern.compile( "^(\\d+)(?=_.*)" );
Matcher matcher = p.matcher(string);
StringBuffer result = new StringBuffer();
while(matcher.find()) {
int number = Integer.parseInt(matcher.group());
m.appendReplacement(result, String.valueOf(number + 1));
}
m.appendTail(result);
return result.toString(); // 1_Beginning
(Конечно, для вашего регулярного выражения цикл будет выполняться только один раз, поскольку регулярное выражение привязано.)
Редактировать : Чтобы уточнить мое утверждение о string.replaceFirst:
Этот метод не возвращает шаблон, но использует его внутренне. Из документации :
Заменяет первую подстроку этой строки, которая соответствует заданному регулярному выражению с заданной заменой.
Вызов этого метода в форме str.replaceFirst(regex, repl)
дает точно такой же результат, как выражение
Pattern.compile(regex).matcher(str).replaceFirst(repl)
Здесь мы видим, что новый шаблон компилируется из первого аргумента.
Это также показывает нам еще один способ сделать то, что вы хотели сделать:
String string = "0_Beginning";
Pattern p = Pattern.compile( "^(\\d+)(?=_.*)" );
Matcher m = p.matcher(string);
if(m.find()) {
digit = m.group();
int oneMore = Integer.parseInt( digit ) + 1
return m.replaceFirst(string, String.valueOf(oneMore));
}
Это скомпилирует шаблон только один раз, а не трижды, как в вашей исходной программе - но все же делаетсовпадение дважды (один раз для поиска, один раз для replaceFirst
), а не один раз, как в моей программе.