Supprimer les caractères de début et de fin d’une chaîne

Supprimer les caractères de début et de fin d'une chaîne

1. introduction

Dans ce court didacticiel, nous verrons plusieurs façons de supprimer les caractères de début et de fin d'unString. Par souci de simplicité, nous supprimerons les zéros dans les exemples.

Avec chaque implémentation, nous allons créer deux méthodes: une pour les zéros de début et une pour les zéros de fin.

Ce problème a un cas particulier: que voulons-nous faire lorsque l'entrée contient uniquement des zéros? Renvoie unString vide ou unString contenant un seul zéro? Nous verrons des implémentations pour les deux cas d'utilisation dans chacune des solutions.

Nous avons des tests unitaires pour chaque implémentation, que vous pouvez trouveron GitHub.

2. Utilisation deStringBuilder

Dans notre première solution, nous allons créer unStringBuilder with the original String, and we’ll delete the unnecessary characters à partir du début ou de la fin:

String removeLeadingZeroes(String s) {
    StringBuilder sb = new StringBuilder(s);
    while (sb.length() > 0 && sb.charAt(0) == '0') {
        sb.deleteCharAt(0);
    }
    return sb.toString();
}

String removeTrailingZeroes(String s) {
    StringBuilder sb = new StringBuilder(s);
    while (sb.length() > 0 && sb.charAt(sb.length() - 1) == '0') {
        sb.setLength(sb.length() - 1);
    }
    return sb.toString();
}

Notez que nous utilisonsStringBuilder.setLength() au lieu deStringBuilder.deleteCharAt() lorsque nous supprimons les zéros de fin, car cela supprime également les derniers caractères et il est plus performant.

Si nousdon’t want to return an empty String lorsque l'entrée ne contient que des zéros, la seule chose que nous devons faire est destop the loop if there’s only a single character left.

Par conséquent, nous changeons la condition de boucle:

String removeLeadingZeroes(String s) {
    StringBuilder sb = new StringBuilder(s);
    while (sb.length() > 1 && sb.charAt(0) == '0') {
        sb.deleteCharAt(0);
    }
    return sb.toString();
}

String removeTrailingZeroes(String s) {
    StringBuilder sb = new StringBuilder(s);
    while (sb.length() > 1 && sb.charAt(sb.length() - 1) == '0') {
        sb.setLength(sb.length() - 1);
    }
    return sb.toString();
}

3. Utilisation deString.subString()

Dans cette solution, lorsque nous supprimons les zéros de début ou de fin, nousfind the position of the first or last non-zero character.

Après cela, il suffit d'appelersubstring(), pour renvoyer les parties restantes:

String removeLeadingZeroes(String s) {
    int index;
    for (index = 0; index < s.length(); index++) {
        if (s.charAt(index) != '0') {
            break;
        }
    }
    return s.substring(index);
}

String removeTrailingZeroes(String s) {
    int index;
    for (index = s.length() - 1; index >= 0; index--) {
        if (s.charAt(index) != '0') {
            break;
        }
    }
    return s.substring(0, index + 1);
}

Notez que nous devons déclarer la variableindex avant la boucle for car nous voulons utiliser la variable en dehors de la portée de la boucle.

Notez également que nous devons rechercher manuellement les caractères non nuls, carString.indexOf() etString.lastIndexOf() ne fonctionnent que pour une correspondance exacte.

Si nousdon’t want to return an empty String, nous devons faire la même chose qu'avant:change the loop condition:

String removeLeadingZeroes(String s) {
    int index;
    for (index = 0; index < s.length() - 1; index++) {
        if (s.charAt(index) != '0') {
            break;
        }
    }
    return s.substring(index);
}

String removeTrailingZeroes(String s) {
    int index;
    for (index = s.length() - 1; index > 0; index--) {
        if (s.charAt(index) != '0') {
            break;
        }
    }
    return s.substring(0, index + 1);
}

4. Utiliser Apache Commons

Apache Commons a de nombreuses classes utiles, y comprisorg.apache.commons.lang.StringUtils. Pour être plus précis, cette classe est dans Apache Commons Lang3.

4.1. Les dépendances

Nous pouvons utiliserApache Commons Lang3 en insérant cette dépendance dans notre fichierpom.xml:


    org.apache.commons
    commons-lang3
    3.8.1

4.2. la mise en oeuvre

Dans la classeStringUtils, nous avons les méthodesstripStart() etstripEnd(). Ils suppriment les caractères de début et de fin respectivement.

Comme c'est exactement ce dont nous avons besoin, notre solution est assez simple:

String removeLeadingZeroes(String s) {
    return StringUtils.stripStart(s, "0");
}

String removeTrailingZeroes(String s) {
    return StringUtils.stripEnd(s, "0");
}

Malheureusement, nous ne pouvons pas configurer si nous voulons supprimer toutes les occurrences ou non. Par conséquent, nous devons le contrôler manuellement.

Si l’entrée n’était pas vide, mais que leString dépouillé est vide, nous devons renvoyer exactement un zéro:

String removeLeadingZeroes(String s) {
    String stripped = StringUtils.stripStart(s, "0");
    if (stripped.isEmpty() && !s.isEmpty()) {
        return "0";
    }
    return stripped;
}

String removeTrailingZeroes(String s) {
    String stripped = StringUtils.stripEnd(s, "0");
    if (stripped.isEmpty() && !s.isEmpty()) {
        return "0";
    }
    return stripped;
}

Notez que ces méthodes acceptent unString comme deuxième paramètre. CeString représente un ensemble de caractères, pas une séquence que nous voulons supprimer.

Par exemple, si nous transmettons“01”, ils supprimeront tous les caractères de début ou de fin, qui sont soit‘0' soit‘1'.

5. Utilisation de goyave

Goyave fournit également de nombreuses classes d'utilitaires. Pour ce problème, nous pouvons utilisercom.google.common.base.CharMatcher, qui fournit des méthodes utilitaires pour interagir avec les caractères correspondants.

5.1. Les dépendances

Pour utiliser Guava, nous devons ajouter lesdependencies suivants à notre fichierpom.xml:


    com.google.guava
    guava
    27.0.1-jre

Notez que si nous voulons utiliser Guava dans une application Android, nous devrions utiliser la version27.0-android à la place.

5.2. la mise en oeuvre

Dans notre cas, nous nous intéressons auxtrimLeadingFrom() ettrimTrailingFrom().

Comme leur nom l'indique, ils suppriment respectivement tout caractère de début ou de fin d'unString, qui correspond auxCharMatcher:

String removeLeadingZeroes(String s) {
    return CharMatcher.is('0').trimLeadingFrom(s);
}

String removeTrailingZeroes(String s) {
    return CharMatcher.is('0').trimTrailingFrom(s);
}

Ils ont les mêmes caractéristiques que les méthodes Apache Commons que nous avons vues.

Par conséquent, si nous ne voulons pas supprimer tous les zéros, nous pouvons utiliser la même astuce:

String removeLeadingZeroes(String s) {
    String stripped = CharMatcher.is('0').trimLeadingFrom(s);
    if (stripped.isEmpty() && !s.isEmpty()) {
        return "0";
    }
    return stripped;
}

String removeTrailingZeroes(String s) {
    String stripped = CharMatcher.is('0').trimTrailingFrom(s);
    if (stripped.isEmpty() && !s.isEmpty()) {
        return "0";
    }
    return stripped;
}

Notez qu'avecCharMatcher, nous pouvons créer des règles de correspondance plus complexes.

6. Utiliser des expressions régulières

Puisque notre problème est un problème de correspondance de modèles, nous pouvons utiliser des expressions régulières:we want to match all zeroes at the beginning or the end d'unString.

En plus de cela, nous voulons supprimer les zéros correspondants. En d'autres termes, nous voulonsreplace them with nothing, or in other words, an empty String.

Nous pouvons faire exactement cela, avec la méthodeString.replaceAll():

String removeLeadingZeroes(String s) {
    return s.replaceAll("^0+", "");
}

String removeTrailingZeroes(String s) {
    return s.replaceAll("0+$", "");
}

Si nous ne voulons pas supprimer tous les zéros, nous pourrions utiliser la même solution que celle que nous avons utilisée avec Apache Commons et Guava. Cependant, il existe une manière pure expression régulière de faire cela: nous devons fournir un modèle qui ne correspond pas à l'ensemble desString.

Ainsi, si l’entrée ne contient que des zéros, le moteur d’expression régulière en conservera exactement un en dehors de la correspondance. Nous pouvons le faire avec les motifs suivants:

String removeLeadingZeroes(String s) {
    return s.replaceAll("^0+(?!$)", "");
}

String removeTrailingZeroes(String s) {
    return s.replaceAll("(?!^)0+$", "");
}

Notez que“(?!^)” et“(?!$)” signifie que ce n’est ni le début ni la fin desString respectivement.

7. Conclusion

Dans ce didacticiel, nous avons vu plusieurs façons de supprimer les caractères de début et de fin d'unString. Le choix entre ces mises en œuvre est souvent simplement une préférence personnelle.

Comme d'habitude, les exemples sont disponiblesover on GitHub.