1

Problème très difficile, qui fait appel à des outils algorithmiques très complexes, que j’ai un peu de mal à résoudre.

Je récupère dans mon appli web un texte saisi par l’utilisateur et je voudrais le découper en paragraphes. Deux paragraphes sont séparés par deux sauts de ligne consécutifs.

Si j’écris ceci :
		String[] paragraphs = content.split("\n");
		for (String paragraph : paragraphs) {
			Post post = new Post(author, paragraph, this).save();
		}

J’obtiens bien un nouveau message par ligne de texte saisi par l’utilisateur.
Mais si je remplace l’expression régulière du split par :
String[] paragraphs = content.split("\n\n");
J’obtiens un seul message même si l’utilisateur met plein de sauts de lignes entre ses deux paragraphes.

J’imagine qu’un saut de ligne ne correspond pas seulement au caractère '\n', il y peut-être autre chose mais quoi ? Je voudrais une solution cross-browser et cross-platform.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

2

Étonnamment, si je mets "\r\n(\r\n)+" ça fonctionne parfaitement, mais est-ce portable ?
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

3

4

Ça marche aussi.
En fait ce qui me tracasse c’est qu’en regardant ça : http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html
Il apparaît qu’il y a vraiment une multitude de manières de faire des retours à la ligne.
Je n’ai pas réussi à m’en sortir avec une expression régulière utilisant ^ et $ (ce qui aurait pu être plus propre pourtant, non ?).
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

5

En vrai les OS n'utilisent que CR et LF : http://en.wikipedia.org/wiki/Newline
A ta place j'utiliserais http://java.sun.com/j2se/1.4.2/docs/api/java/io/BufferedReader.html#readLine() qui prend en compte les 3 formats différents.

Après si tu veux vraiment passer par une regexp, et donc utiliser $, il faut que tu passes en multiline: http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html#MULTILINE
Et donc passer par Pattern.compile.split plutôt que String.split (cf le code source de String.split)

6

Ah merde pour le MULTILINE, j’avais compris l’inverse en lisant la doc toute à l’heure… Bon bah c’est cool.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

7

Windows fit du CR LF alors que Unix linux mac font du CR tout seul...
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

8

C'est du LF tout seul sous *nix. CR seul, c'était la convention Mac, mais maintenant OS X est un Unix™ certifié, donc je suppose qu'ils utilisent aussi le LF seul presque partout. (Et on trouve le CR seul à quelques autres endroits, par exemple chez l'AMS des calculatrices TI 68k, et aussi comme convention du BASIC, qui convertit traditionellement le CR LF des fichiers en CR seul quand on les lit en mode texte.)
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité