1
votes

Chiffres uniques de la chaîne dans Java Regex

É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


6 commentaires

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] \ b regex pour correspondre à 1 , 2 , 3 ou 4 sous 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 # split ne fonctionne pas de la même manière que Matcher # find et c'est le principal problème.


Merci, @ WiktorStribiżew pour l'expliquer.


3 Réponses :


2
votes

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.


2 commentaires

@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 =)



3
votes

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));


1 commentaires

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)



1
votes

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"


0 commentaires