2
votes

regex (lookahead) avec plusieurs chiffres

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 ()?


1 commentaires

quelle sera la sortie souhaitée pour 9) texte sur 9 10) texte 9 sur 10 ?


4 Réponses :


0
votes

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


0 commentaires

3
votes

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 >


5 commentaires

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!



0
votes

Essayez le quantificateur paresseux au lieu du quantificateur gourmand. Essayez le Regex ci-dessous.

(\d*\).*?\d+)


0 commentaires

0
votes

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]


0 commentaires