0
votes

Supprimer la barre oblique finale après la substitution

J'ai besoin de supprimer [/]00/ de fin d'une chaîne donnée.

Exemples:

\d{2}\/(?=(?:\d{2}\/)+$)

J'ai eu du mal avec ça mais je ne comprends pas vraiment comment supprimer [/] de [/]00 .

Je veux dire, l'expression remplacée doit se terminer par un / .

J'ai essayé avec cette expression:

string: '01/00/00/00/00/00/00/' -> 01
string: '01/02/03/00/00/00/00/' -> 01/02/03
string: '10/25/03/56/00/00/00/' -> 10/25/03/56

Les correspondances sont:

C'est confus pour moi ...

Des idées?


5 commentaires

Veuillez partager votre regex actuelle.


Je n'ai pas été en mesure d'écrire une expression de travail minimale


Vous pouvez utiliser: str = str.replaceFirst("(?:/00)+/?$", "");


/(?:00/)+$ fera l'affaire . \d{2}\/(?=(?:\d{2}\/)+$) extrait toute séquence de 2 chiffres suivie de 1+ occurrences de 2 chiffres + / jusqu'à la fin de la chaîne.


Similaire à cette question, cela ressemble à un autre doublon de cette question, mais avec l'exigence SQL au lieu de l'exigence Regex supprimée.


3 Réponses :


0
votes

Vous pouvez utiliser l'expression régulière /00|(?<=(00))/ qui signifie /00 OU / précédé de 00 .

Démo:

01/00/00/00/00/00/00/ => 01
01/02/03/00/00/00/00/ => 01/02/03
10/25/03/56/00/00/00/ => 10/25/03/56

Production:

public class Main {
    public static void main(String[] args) {
        String[] arr = { "01/00/00/00/00/00/00/", "01/02/03/00/00/00/00/", "10/25/03/56/00/00/00/" };
        for (String s : arr) {
            System.out.println(s + " => " + s.replaceAll("/00|(?<=(00))/", ""));
        }
    }
}

Remarque ?<= Est utilisé pour spécifier une analyse positive .


0 commentaires

0
votes

Alternatif:

01
01/02/03
10/25/03/56

Remarque: Le correcteur de limite '$' sera pris en compte lorsque le drapeau Pattern.MULTILINE est utilisé.

Regex montré dans testbench et contexte:

public static void main(String[] args) {
    String input = "01/00/00/00/00/00/00/\n"
            + "01/02/03/00/00/00/00/\n"
            + "10/25/03/56/00/00/00/";

    String result = Pattern.compile("/00|/$", Pattern.MULTILINE).matcher(input).replaceAll("");

    System.out.println(result);
}

Production:

Pattern.compile("/00|/$", Pattern.MULTILINE).matcher(input).replaceAll("");


0 commentaires

0
votes

Pas besoin de regarder en avant ou en arrière. Recherchez simplement une barre oblique suivie d'un nombre quelconque de 00/ séquences:

str = str.replaceFirst("/(?:00/)*$", "");

Pour de meilleures performances, vous pouvez faire du groupe un groupe sans capture:

str = str.replaceFirst("/(00/)*$", "");


1 commentaires

Oui, aucune recherche n'est nécessaire. Fondamentalement, c'est la même chose que ma suggestion , seul le quantificateur * ici est utilisé pour faire correspondre zéro ou plusieurs occurrences de 00/ après / et jusqu'à la fin de la chaîne.