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
3 Réponses :
Vous pouvez remplacer la dernière pièce après le point, puis en utilisant split avec / | (\ -) (?!. * \ -) :
[DATA, 2019-00-01, 23]
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]
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". 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.)