J'ai une chaîne qui ressemble à:
text = "9) texte de 9 \ r \ n10) texte de 10 \ r \ n11) texte de 11 \ r \ n12) ... \ r \ n123) texte de 123 "
J'essaye de le diviser comme suit:
String [] result = text.split ("(? = \\ d + \\))");
Le résultat que je recherche est:
- result[0] = "9) text of 9" - result[1] = "10) text of 10" - result[2] = "11) text of 11" - ...
Mais cela ne fonctionne pas. Quelle expression régulière dois-je utiliser avec text.split ()?
4 Réponses :
L'expression régulière "(\\ d +) \\) text of (\\ d +)" fera l'affaire, comme ceci:
found matches: true [10) text of 10, 11) text of 11, 123) text of 123] [10) text of 10, 11) text of 11, 123) text of 123]
La sortie sera:
String s = "9) text of 9 10) text of 10 11) text of 11 ... 123) text of 123";
Pattern p = Pattern.compile("(\\d+)\\) text of (\\d+)");
Matcher m = p.matcher(s);
boolean matchesFound = m.find();
System.out.println("found matches: "+matchesFound);
List<String> results = m.results().map(MatchResult::group).map(Object::toString).collect(Collectors.toList());
System.out.println(results);
String[] resultsAsArray = new String[results.size()];
results.toArray(resultsAsArray);
System.out.println(Arrays.toString(resultsAsArray));
Si vous souhaitez placer les résultats dans une liste / un tableau à la place, procédez comme suit:
found matches: true 10) text of 10 11) text of 11 123) text of 123
Le résultat ici sera:
String s = "9) text of 9 10) text of 10 11) text of 11 ... 123) text of 123";
Pattern p = Pattern.compile("(\\d+)\\) text of (\\d+)");
Matcher m = p.matcher(s);
boolean matchesFound = m.find();
System.out.println("found matches: "+matchesFound);
m.results().map(MatchResult::group).forEach(System.out::println);
Je pense que vous étiez très proche - avez-vous essayé d'ajouter le délimiteur avant la recherche?
let x= "9) text of 9 10) text of 10 11) text of 11 ... 123) text of 123" let result = x.split(/\\r\\n(?=\d+\))/);
Je l'ai essayé dans la console JS (le regex JS est assez similaire à l'expression régulière Java processeur)
String[] result = text.split("\\r\\n(?=\d+\))");
résultat donne alors le tableau que vous vouliez
Mise à jour : réponse de code mise à jour basée sur la question mise à jour p >
Il fonctionne en Java avec juste l'espace devant sans rien modifier d'autre, il suffit de l'essayer: s.split ("(? = \\ d + \\))")
Étrange. Quand je l'utilise avec l'espace devant, toute la chaîne finit par être dans le résultat [0].
Désolé, j'ai oublié qu'il y a aussi "\ r \ n \" avant chaque XX) - édité ma question ci-dessus. Je pense que c'est pour ça que ça n'a pas marché pour moi
Essayez de remplacer l'espace avant la parenthèse dans l'expression régulière que j'ai fournie avec le \\ r \\ n - c'est ce sur quoi vous vous divisez - vous pouvez également essayer / s + là aussi
Le remplacement de l'espace dans l'expression régulière par \\ r \\ n a fonctionné! Je vous remercie!
Essayez le quantificateur paresseux au lieu du quantificateur gourmand. Essayez le Regex ci-dessous.
(\d*\).*?\d+)
Cette petite ligne de code résoudra votre problème.
List<String> matchlist = new ArrayList();
String text = "9) text of 9 10) text of 10 11) text of 11";
Pattern regex = Pattern.compile("\\d+\\)[a-zA-Z\\s]*\\d+");
Matcher result = regex.matcher(text);
while (result.find()) {
matchlist.add(result.group());
}
System.out.println(matchlist);
Le matcher (ArrayList) contiendra la sortie requise comme indiqué ci-dessous:
[9) text of 9, 10) texte sur 10, 11) texte sur 11]
quelle sera la sortie souhaitée pour
9) texte sur 9 10) texte 9 sur 10?