1
votes

Diviser une chaîne en utilisant l'expression régulière en 3 parties

J'ai une chaîne comme celle-ci

[DATA, 2019, 01, x]

Je veux obtenir trois jetons Texte, Date et Heure

String x = "DATA/2019-00-01-23.x";
System.out.println(Arrays.toString(x.split("/|-[0-9]+.")))

J'ai essayé ceci

[DATA, 2019-00-01, 23]

Cela me renvoie

DATA/2019-00-01-23.x


0 commentaires

3 Réponses :


0
votes

Solution 1

Vous pouvez remplacer la dernière pièce après le point, puis en utilisant split avec / | (\ -) (?!. * \ -) ​​ :

[DATA, 2019-00-01, 23]

Solution 2

Je le ferais aller avec Pattern et Matcher et des groupes comme ça (. *?) / (. *?) - ([^ -] +) \\ .. * :

String[] result = Pattern.compile("(.*?)/(.*?)-([^-]+)\\..*")
        .matcher("DATA/2019-00-01-23.x")
        .results()
        .flatMap(grps -> Stream.of(grps.group(1), grps.group(2), grps.group(3)))
        .toArray(String[]::new);

Ou en utilisant Java9 +, vous pouvez utiliser:

Pattern pattern = Pattern.compile("(.*?)/(.*?)-([^-]+)\\..*");
Matcher matcher = pattern.matcher("DATA/2019-00-01-23.x");
if(matcher.find()){
    System.out.println(matcher.group(1)); // DATA
    System.out.println(matcher.group(2)); // 2019-00-01
    System.out.println(matcher.group(3)); // 23
}

Sorties

String[] split = "DATA/2019-00-01-23.x".replaceFirst("\\..*$", "")
    .split("/|(\\-)(?!.*\\-)"); // [DATA, 2019-00-01, 23]

0 commentaires

0
votes

Utilisez des groupes de capture pour extraire les trois parties.

private static final Pattern PATTERN = Pattern.compile("(.+)/([-0-9]+)-([0-9]{1,2})\\..*");

public static void main(String... args) {
    Matcher matcher = PATTERN.matcher("DATA/2019-00-01-23.x");

    if (matcher.matches() && matcher.groupCount() == 3) {
        String text = matcher.group(1);
        String date = matcher.group(2);
        String hour = matcher.group(3);
        System.out.println(text + "\t" + date + '\t' + hour);
    }
}

Dissected: (. +) / ([- 0-9] +) - ([0-9] {2}) \..*

  • (. +) Tout avant le /
  • ([-0-9] +) Numéros, peut contenir -
  • - pour éviter que la partie précédente engloutisse l'heure
  • ([0-9] {2}) Deux chiffres
  • \ .. * Un point, puis "le reste".


0 commentaires

1
votes

Vous pouvez en fait utiliser un split comme

x.split("/|-(?=[^-]*$)|\\D+$")

Voir le Démo Java , résultat: [DATA, 2019-00-01, 23] .

Cette expression régulière sera divisée à

  • / - une barre oblique
  • | - ou
  • - (? = [^ -] * $) - dernier trait d'union de la chaîne
  • | - ou
  • \ D + $ - 1 ou plus de caractères non numériques à la fin de la chaîne (comme String.split (regex) est exécuté avec limit comme 0 , ces correspondances à la fin de la chaîne ne donnent pas lieu à des éléments vides de fin dans le tableau résultant.)


0 commentaires