Les états de l' API Java pour les expressions régulières qui \s
correspondent aux espaces. Ainsi, l'expression régulière \\s\\s
doit correspondre à deux espaces.
Pattern whitespace = Pattern.compile("\\s\\s");
matcher = whitespace.matcher(modLine);
while (matcher.find()) matcher.replaceAll(" ");
Le but de ceci est de remplacer toutes les instances de deux espaces blancs consécutifs par un seul espace. Cependant, cela ne fonctionne pas réellement.
Ai-je un grave malentendu sur les expressions régulières ou le terme «espace blanc»?
"abc \xA0 def \x85 xyz"
pour voir ce que je veux dire: il n'y a que trois champs.Réponses:
Ouais, vous devez saisir le résultat de
matcher.replaceAll()
:la source
Vous ne pouvez pas utiliser
\s
en Java pour faire correspondre l'espace blanc sur son propre jeu de caractères natif, car Java ne prend pas en charge la propriété d'espace blanc Unicode - même si cela est strictement nécessaire pour respecter la RL1.2 de UTS # 18! Ce qu'il a n'est hélas pas conforme aux normes.Unicode définit 26 points de code comme suit
\p{White_Space}
: 20 d'entre eux sont différentes sortes de\pZ
GeneralCategory = Separator , et les 6 restants sont\p{Cc}
GeneralCategory = Control .L'espace blanc est une propriété assez stable, et ces mêmes existent depuis presque toujours. Même ainsi, Java n'a pas de propriété conforme à la norme Unicode pour ceux-ci, vous devez donc utiliser un code comme celui-ci:
Vous pouvez maintenant l'utiliser
whitespace_charclass + "+"
comme modèle dans votre fichierreplaceAll
.Désolé pour tout ça. Les expressions régulières de Java ne fonctionnent tout simplement pas très bien sur son propre jeu de caractères natif, et vous devez donc vraiment sauter à travers des cerceaux exotiques pour les faire fonctionner.
Et si vous pensez que les espaces blancs sont mauvais, vous devriez voir ce que vous devez faire pour obtenir
\w
et\b
enfin se comporter correctement!Oui, c'est possible, et oui, c'est un désordre hallucinant. C'est même de la charité. Le moyen le plus simple d'obtenir une bibliothèque de regex conforme aux normes pour Java est d'utiliser JNI vers ICU. C'est ce que fait Google pour Android, car OraSun n'est pas à la hauteur.
Si vous ne voulez pas faire cela mais que vous voulez toujours vous en tenir à Java, j'ai une bibliothèque de réécriture de regex frontale que j'ai écrite qui «corrige» les modèles de Java, au moins pour les rendre conformes aux exigences de RL1.2a en UTS # 18, Expressions régulières Unicode .
la source
Pour Java (ni php, ni javascript, ni aucun autre):
la source
quand j'ai envoyé une question à un forum Regexbuddy (application de développement regex), j'ai obtenu une réponse plus exacte à ma question Java:
"Auteur du message: Jan Goyvaerts
En Java, les raccourcis \ s, \ d et \ w incluent uniquement des caractères ASCII. ... Ce n'est pas un bogue en Java, mais simplement l'une des nombreuses choses dont vous devez être conscient lorsque vous travaillez avec des expressions régulières. Pour faire correspondre tous les espaces blancs Unicode ainsi que les sauts de ligne, vous pouvez utiliser [\ s \ p {Z}] en Java. RegexBuddy ne prend pas encore en charge les propriétés spécifiques à Java telles que \ p {javaSpaceChar} (qui correspond exactement aux mêmes caractères que [\ s \ p {Z}]).
... \ s \ s correspondra à deux espaces, si l'entrée est uniquement ASCII. Le vrai problème vient du code de l'OP, comme le souligne la réponse acceptée à cette question. "
la source
[\s\p{z}]
omet le caractère Unicode "ligne suivante" U + 0085. Utilisez[\s\u0085\p{Z}]
.Semble fonctionner pour moi:
imprimera:
Je pense que vous aviez l'intention de faire ceci au lieu de votre code:
la source
Pour vos besoins, vous pouvez utiliser cet extrait de code:
Cela normalisera l'espacement en simple et supprimera également les espaces blancs de départ et de fin.
la source
la source
Java a évolué depuis que ce problème a été soulevé pour la première fois. Vous pouvez faire correspondre toutes sortes de caractères d'espacement Unicode en utilisant le
\p{Zs}
groupe.Ainsi, si vous souhaitez remplacer un ou plusieurs espaces exotiques par un espace simple, vous pouvez le faire:
Il convient également de savoir, si vous avez utilisé la
trim()
fonction de chaîne que vous devriez jeter un oeil à la (relativement nouveau)strip()
,stripLeading()
et desstripTrailing()
fonctions sur les chaînes. Le peut vous aider à découper toutes sortes de caractères d'espaces blancs. Pour plus d'informations sur l'espace inclus, consultez laCharacter.isWhitespace()
fonction Java .la source
L'utilisation d'espaces dans RE est une douleur, mais je pense qu'ils fonctionnent. Le problème de l'OP peut également être résolu en utilisant StringTokenizer ou la méthode split (). Cependant, pour utiliser RE (décommentez println () pour voir comment le matcher rompt la chaîne), voici un exemple de code:
Il produit ce qui suit (compilez avec javac et exécutez à l'invite de commande):
% java Two21WS Initial: "ab cdef gh ij kl" Two21WS: "ab cdef gh ij kl"
la source
replaceAll()
place?