Как я могу получить последнее целое число "56" из строки, как ra12ke43sh56? - PullRequest
7 голосов
/ 21 июня 2010

Как я могу получить последнее целое число "56" из строки, как ra12ke43sh56?

Мне нужно изменить следующее значение как ra12ke43sh57, поэтому я хочу получить последнее целое значение.

Ответы [ 6 ]

22 голосов
/ 21 июня 2010
StringBuilder sb = new StringBuilder();
for (int i = str.length() - 1; i >= 0; i --) {
    char c = str.charAt(i);
    if (Character.isDigit(c)) {
        sb.insert(0, c);
    } else {
        break;
    }
}
String result = sb.toString();

или

Pattern p = Pattern.compile("[0-9]+$");
Matcher m = p.matcher(str);
if(m.find()) {
    result = m.group();
}

А потом Integer.parseInt(result)

4 голосов
/ 23 июня 2010

Возможно, что-то вроде этого и нужно ( см. Также на ideone.com ):

static String nextId(String id) {
    String[] parts = id.split("(?=\\d+$)", 2);
    final int L = parts[1].length();
    final int num = Integer.parseInt(parts[1]) + 1;
    return parts[0] + String.format("%0"+L+"d", num);
}
public static void main(String[] args) {
    String[] tests = {
        "jamesBond007", "ra12ke43sh57", "-42", "x888y999", "00000"
    };
    for (String test : tests) {
        System.out.println(nextId(test));
    }
    // prints "jamesBond008", "ra12ke43sh58", "-43", "x888y1000", "00001"
}

Как это работает

Есть нескольковещи на работе здесь:

  • Использование String.split(String regex, int limit), ограничено 2 частями
    • parts[0] - статический префикс, возможно, пустой
    • parts[1] - это последовательность цифр в конце строки
  • Использование положительного взгляда с нулевой шириной для разделения
    • (?=\d+$) соответствует позиции, в которой выможет соответствовать \d+$
      • То есть символ цифры \d класс символов
      • ... повторяется один или несколько раз +
      • ... доконец строки привязки $
  • Использование String.format для сохранения любых ведущих нулей
    • Форматкак %05d означает:
      • 0: заполнение с начальными нулями
      • 5: ширина 5
      • d: преобразование десятичного целого числа

Похожие очередиstions

О внешнем виде:

Ссылки

2 голосов
/ 24 июня 2010

Не ответ, просто упомяну, что «очевидные» регулярные выражения для этого (как опубликовано выше) имеют неприятное квадратичное поведение в худшем случае (хотя я почти уверен, что вы не имеете дело с такими вырожденными случаями, но это интересно само по себе).

Вот небольшой график, который я подготовил: альтернативный текст http://img517.imageshack.us/img517/1158/imageerp.jpg

Я использовал строки вида "111..1111a2" Есть J вхождений '1'.

Причина плохой производительности очевидна: помощник продолжает видеть 1 с и радостно думает, что он добьется успеха, и только когда он находит a почти в конце, он обнаруживает, что a не соответствует $, таким образом, он проходит весь путь назад и начинается со второго символа.

Первоначально я думал, что притяжательные квантификаторы здесь помогут, но это не выглядит прямо. Даже если я напишу \d++, если я вызову matcher.find (), он все равно попытается сопоставить шаблон , начиная с каждого индекса , т. Е. Внешний цикл не получает подсказок от предыдущих сбоев позитивных квантификаторов , (Обратите внимание, что эта проблема не влияет на Matcher.matches (), так как он пытается сопоставить только по одному индексу, началу).

В этой конкретной задаче, чтобы избежать такого поведения, мы должны были бы перевернуть строку и выполнить поиск по простому шаблону ^\\d+ или выполнить итерацию символов назад и выполнить ручное сопоставление.

1 голос
/ 27 июня 2019
String result = str.substring(str.replaceAll("[0-9]+$","").length());

Разбить это, если str равно ra12ke43sh56:

str.replaceAll("[0-9]+$","") 

возвращает все, кроме последнего набора цифр, т.е. ra12ke43sh

substring издлина этого в основной строке возвращает только конечные цифры, т.е. 56.

0 голосов
/ 31 января 2019
  public static String getLastDigits(String string) {
    String reverseTaskId = new StringBuilder(string).reverse().toString();
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < reverseTaskId.length(); i++) {
        if (Character.isDigit(reverseTaskId.charAt(i))) {
            sb.insert(i, reverseTaskId.charAt(i));
        } else {
            break;
        }
    }
    return sb.reverse().toString();
}
0 голосов
/ 21 июня 2010
public class PrefixId {

    public String getTransactionNumber() {

    String prevNumber = "123abc321";
    String incredNumber = "";
    for (int i = prevNumber.length() - 1; i >= 0; i--) {
        char ch = prevNumber.charAt(i);

        if (incredNumber.length() > 0 && !Character.isDigit(ch)) {
            break;
        } else if (Character.isDigit(ch)) {
            incredNumber = incredNumber + ch;
        }

    }
    if (incredNumber.length() > 0) {
        incredNumber = new StringBuffer(incredNumber).reverse().toString();
        prevNumber = prevNumber.replace(incredNumber, ""
                + (Long.parseLong(incredNumber) + 1));
    }
    return prevNumber;
}

public static void main(String[] args) {
    PrefixId prefixId = new PrefixId();
    System.out.println(prefixId.getTransactionNumber());

}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...