Étant donné une chaîne
{"1","3","2","1","1","3","4","3"}
j'ai trouvé que
/b[1-4]/b
ne renverra que les chiffres 1 2 3 4 code > comme cela montre mais String [] input = args [0] .split ("\ b [1-4] \ b"); ne renvoie pas
1 3 2 1 9 1 bla 3 4 3
3 Réponses :
Le problème avec votre approche actuelle est que vous essayez de vous diviser sur les nombres eux-mêmes. Cela ne donnera pas le résultat escompté, car ce sur lequel vous vous séparez est consommé (lire: supprimé), laissant tout le reste. Au lieu de cela, essayez de diviser sur [^1-4 +:
[1, 3, 2, 1, 1, 3, 4, 3]
Ceci imprime:
String input = "1 3 2 1 9 1 bla 3 4 3";
String[] parts = input.split("[^1-4]+");
System.out.println(Arrays.toString(parts));
Ceci sera divisé en un ou plusieurs caractères non 1-4. Cela fonctionne pour votre chaîne d'entrée, car les espaces sont un délimiteur, et les chiffres et les mots non correspondants doivent également être supprimés.
@JvdV Bonne prise. J'ai fait une modification, qui devrait fonctionner en supposant que les nombres présents seraient toujours de 0 à 9.
C'est une hypothèse assez dangereuse mais là encore, rien à prouver le contraire =)
Je suppose que vous ne voulez que des chiffres entre 1 et 4. Un simple fractionnement ne suffira pas. Une approche pourrait être quelque chose comme ceci:
String str = "1 3 2 1 9 1 bla 3 4 3";
String[] splitAndFilter = Pattern.compile("\\s+")
.splitAsStream(str)
.filter(s -> s.matches("[1-4]"))
.toArray(String[]::new);
System.out.println(Arrays.toString(splitAndFilter));
Je suppose que c'est bien de supprimer les sous-modèles indésirables du texte comme bla-4-bla (si une telle chose se produisait un jour)
Vous pouvez utiliser uniquement [1-4] comme expression régulière.
[1, 3, 2, 1, 1, 3, 4, 3]
Sortie:
import java.util.Arrays;
import java.util.regex.MatchResult;
import java.util.regex.Pattern;
class Main {
public static void main(String[] args) {
String[] matches = Pattern.compile("[1-4]")
.matcher(args[0])
.results()
.map(MatchResult::group)
.toArray(String[]::new);
System.out.println(Arrays.toString(matches));
}
}
où l'argument de ligne de commande est "1 3 2 1 9 1 bla 3 4 3"
Alors, que devrait produire
1 3 23 1 9 1 bla92 3 4 3?"1 3 1 1 3 4 3"
Faites correspondre simplement avec
"\\ b [1-4] \\ b"@ WiktorStribiżew - J'ai beaucoup appris sur les modèles de regex grâce à vos messages. Vous êtes simplement curieux de savoir si
[1-4]ne suffit pas? Sinon, quels problèmes peuvent survenir si j'utilise uniquement[1-4]?@ArvindKumarAvinash Désolé, je viens d'utiliser le modèle OP, mais j'ai corrigé le problème des barres obliques inverses. OP semble avoir utilisé
\ b [1-4] \ bregex pour correspondre à1,2,3ou4sous forme de mots entiers, c'est-à-dire uniquement lorsqu'ils ne sont pas entourés d'autres chiffres, lettres ou traits de soulignement. Aucune idée si c'est vraiment ce dont OP a besoin. Une chose est sûre:String # splitne fonctionne pas de la même manière queMatcher # findet c'est le principal problème.Merci, @ WiktorStribiżew pour l'expliquer.