8
votes

Comment puis-je obtenir le dernier entier "56" de la chaîne comme RA12KE43SH56?

Comment puis-je obtenir le dernier entier "56" de la chaîne comme RA12KE43SH56?

Je dois modifier la valeur suivante que RA12KE43SH57 afin que je souhaite obtenir la dernière valeur entière.


0 commentaires

6 Réponses :


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

3 commentaires

Pourquoi pas seulement épingler le re à la fin avec '[0-9] + $'?


Merci mais cela fonctionnera pour le dernier chiffre ABC88 mais quand il vient ABC9999, cela ne fonctionnera pas


@nynerobot - En effet, j'ai mis à jour ma réponse @rakesh - je n'ai pas reçu votre commentaire. Cela fonctionne également avec ABC9999.



0
votes
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());

}
}

0 commentaires

4
votes

Peut-être que quelque chose comme ceci est ce que vous voulez ( Voir aussi sur iDoneone.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"
}


1 commentaires

Vous êtes évidemment amoureux des regards de surveillance :) Mais dans ce cas, le simple "(\\ d +) $" (\\ d +) $ "ferait également - capturer directement l'ID directement, au lieu de faire correspondre la position de départ de l'ID et de la scinder la chaîne.



2
votes

Pas une réponse, il suffit de mentionner que les expressions régulières "évidentes" pour cela (comme indiqué ci-dessus) ont un comportement quadratique méchant dans le pire des cas (je suis sûr que vous ne traitez pas de tels cas dégénéré, mais C'est intéressant dans son propre accord).

Voici un petit graphique que j'ai préparé: Texte alt http://img517.imageshack.us/img517/1158/IMAGEERP.JPG < / a>

J'ai utilisé des chaînes de la forme "111..111111111111111111111" Il existe des occurrences j de '1'.

La raison de la mauvaise performance est évidente: le matcheur continue de voir 1s et pense heureusement que cela va réussir, et seulement quand il trouve a presque la fin, il trouve que a ne correspond pas à $ , de sorte que cela revient tout en arrière et commence au deuxième caractère.

Au départ, je pensais que les quantifiers possessifs aideraient ici, mais cela n'a pas l'air simple. Même si j'écris \ d ++ , si j'appelle Matcher.find (), il essaiera toujours de faire correspondre le motif à partir de chaque index de toute façon, c'est-à-dire que la boucle extérieure ne prend aucune indication de la précédente échoue de quantifiers possessifs. (Notez que ce problème n'affecte pas la correspondance.Matches (), car cela ne tente que de correspondre à un seul index, le début).

Dans ce problème particulier, pour éviter ce problème, nous devrions inverser la chaîne et rechercher avec un modèle ^ \\ d + ou itérer les caractères à l'envers et faire une correspondance manuelle.



1
votes
  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 commentaires

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

0 commentaires