114 votes

Correspondance des espaces blancs regex - Java

L'API Java pour les expressions régulières, les états qui \s correspondra à un espace. Donc la regex \\s\\s doit correspondre à deux espaces.

Pattern whitespace = Pattern.compile("\\s\\s");
matcher = whitespace.matcher(modLine);
while (matcher.find()) matcher.replaceAll(" ");

Le but de cela est de remplacer toutes les occurrences de deux espaces consécutifs avec un seul espace. Cependant, ce n'est pas réellement le travail.

Suis-je en avoir une grave incompréhension de regexes ou le terme "espace"?

215voto

tchrist Points 47116

Vous ne pouvez pas utiliser \s en Java pour correspondre à un espace blanc sur son propre jeu de caractères locaux, car Java ne supporte pas l'Unicode blanc, espace bien - même si cela est strictement nécessaire pour répondre à l'UT#18 RL1.2! Ce qu'il fait n'est pas de normes conformes, hélas.

Unicode définit les 26 points de code comme \p{White_Space}: 20 d'entre eux sont de diverses sortes d' \pZ GeneralCategory=Séparateur, et les 6 autres sont \p{Cc} GeneralCategory=Contrôle.

L'espace blanc est une jolie propriété stable, et ceux mêmes que celles qui ont été autour presque jamais. De même, Java n'a pas de propriété qui est conforme à La Norme Unicode pour ceux-ci, donc vous devez utiliser le code comme ceci:

String whitespace_chars =  ""       /* dummy empty string for homogeneity */
                        + "\\u0009" // CHARACTER TABULATION
                        + "\\u000A" // LINE FEED (LF)
                        + "\\u000B" // LINE TABULATION
                        + "\\u000C" // FORM FEED (FF)
                        + "\\u000D" // CARRIAGE RETURN (CR)
                        + "\\u0020" // SPACE
                        + "\\u0085" // NEXT LINE (NEL) 
                        + "\\u00A0" // NO-BREAK SPACE
                        + "\\u1680" // OGHAM SPACE MARK
                        + "\\u180E" // MONGOLIAN VOWEL SEPARATOR
                        + "\\u2000" // EN QUAD 
                        + "\\u2001" // EM QUAD 
                        + "\\u2002" // EN SPACE
                        + "\\u2003" // EM SPACE
                        + "\\u2004" // THREE-PER-EM SPACE
                        + "\\u2005" // FOUR-PER-EM SPACE
                        + "\\u2006" // SIX-PER-EM SPACE
                        + "\\u2007" // FIGURE SPACE
                        + "\\u2008" // PUNCTUATION SPACE
                        + "\\u2009" // THIN SPACE
                        + "\\u200A" // HAIR SPACE
                        + "\\u2028" // LINE SEPARATOR
                        + "\\u2029" // PARAGRAPH SEPARATOR
                        + "\\u202F" // NARROW NO-BREAK SPACE
                        + "\\u205F" // MEDIUM MATHEMATICAL SPACE
                        + "\\u3000" // IDEOGRAPHIC SPACE
                        ;        
/* A \s that actually works for Java's native character set: Unicode */
String     whitespace_charclass = "["  + whitespace_chars + "]";    
/* A \S that actually works for  Java's native character set: Unicode */
String not_whitespace_charclass = "[^" + whitespace_chars + "]";

Maintenant, vous pouvez utiliser whitespace_charclass + "+" comme le motif dans votre replaceAll.


=begin soapbox

Désolé 'bout tout cela. Java est regexes ne fonctionnent pas très bien sur son propre jeu de caractères locaux, et si vous avez vraiment à sauter à travers des exotiques, des cerceaux pour les faire travailler.

Et si vous pensez que l'espace blanc est mauvais, vous devriez voir ce que vous avez à faire pour obtenir \w et \b , pour enfin se comporter correctement!

Oui, c'est possible, et oui, c'est un mindnumbing mess. C'est des fins de bienfaisance, même. La meilleure façon d'obtenir une des normes comforming bibliothèque regex pour Java est à la JNI plus aux soins intensifs de trucs. C'est ce que Google fait pour Android, parce OraSun de ne pas être à la hauteur.

Si vous ne voulez pas le faire, mais veulent toujours rester avec Java, j'ai un avant la fin de la regex de la réécriture de la bibliothèque, j'ai écrit que les "corrections" de Java modèles, au moins pour obtenir leur conformité avec les exigences de la RL1.2a en UT#18, Unicode des Expressions Régulières.

=end soapbox

45voto

Raph Levien Points 3518

Oui, vous devez récupérer le résultat de matcher.replaceAll ():

 String result = matcher.replaceAll(" ");
System.out.println(result);
 

18voto

surfealokesea Points 982

Pour Java (pas php, pas javascript, pas autre):

 txt.replaceAll("\\p{javaSpaceChar}{2,}"," ")
 

5voto

Semble travailler pour moi:

 String s = "  a   b      c";
System.out.println("\""  + s.replaceAll("\\s\\s", " ") + "\"");
 

imprimera:

 " a  b   c"
 

Je pense que vous aviez l'intention de faire cela à la place de votre code:

 Pattern whitespace = Pattern.compile("\\s\\s");
Matcher matcher = whitespace.matcher(s);
String result = "";
if (matcher.find()) {
    result = matcher.replaceAll(" ");
}

System.out.println(result);
 

1voto

Khafaga Points 20

Il devrait être

     String result = matcher.replaceAll("\\s{2}");
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X