Est “\n” verticale des espaces, c'est à dire, devrait “\v” match?
C'est logiquement (mais la logique n'est pas pertinent à chaque fois que l'encodage des caractères ou des paramètres régionaux sont en jeu). Selon
perl -e 'print "\n" =~ /\v/? "y\n" : "n\n";'
l'impression de "y", il est. Selon
Pattern.compile("\\v").matcher("\n").matches();
retour false
en java, il n'est pas. Ce ne serait pas me confondre à tous, si il n'y avait pas cette publication affirmant que
Soleil mis à jour du Modèle de classe pour JDK7 a un merveilleux nouveau drapeau, UNICODE_CHARACTER_CLASS, ce qui rend tout travail de nouveau à droite.
Mais je suis en utilisant java version "1.7.0_07" et le drapeau existe et semble ne rien changer du tout. En outre, "\n" est pas un débutant en Unicode, mais un simple vieux de caractères ASCII, donc je ne vois vraiment pas comment cette différence peut arriver. Probablement que je suis en train de faire quelque chose de stupide, mais je ne peux pas le voir.
Drôle. Je viens de trouver liste d'accord avec vous.
Cette question a été ajoutée à la Débordement de Pile dans l'Expression Régulière de la FAQ, sous "les Séquences d'Échappement".
A noter que depuis Java 8,
\v
signifie verticale de l'espaceOriginalL'auteur maaartinus | 2012-09-05
Vous devez vous connecter pour publier un commentaire.
La Javadoc de
java.util.regex.Motif
mentionne explicitement\v
dans sa liste des "Perl constructions non pris en charge par cette classe". Il n'est donc pas que\n
n'appartient pas à la Java de la catégorie de la "verticale de l'espace", c'est que Java n'est pas ont une catégorie de la "verticale de l'espace".Modifiées afin d'ajouter: au Lieu de cela,
\v
représente le caractère de tabulation verticale, U+000B. C'est un traditionnel séquence d'échappement, il y a aussi quelques autres séquences d'échappement qui ne sont pas autorisés dans Java littéraux de chaîne, mais qui sont pris en charge parPattern
(\a
pour alerter/bell,\cX
pour des caractères de contrôleX
). Curieusement, cependant, la Javadoc dePattern
omet de mentionner qu'il prend en charge\v
; donc je ne sais pas si on peut s'attendre à être pris en charge dans tous les JDK implémentations.Pattern.compile("\\C")
il ne jette aucunPatternSyntaxException
. Dans le code source j'ai finalement trouvé qu'il correspond àU+000B
, c'est à dire "vertical onglet" seulement. Ça a l'air drôle.une tradition qui est d'échapper à la séquence de tabulation verticale (dans le même groupe que
\n
,\r
, et ainsi de suite), et bien que Java ne supporte pas dans les littéraux de chaîne (par section 3.10.6 de la JLS), il y a un peu semblable à la non-Java séquences d'échappement quijava.util.regex.Pattern
prend en charge (\a
pour alerter/bell,\cX
pour des caractères de contrôleX
). Le drôle d'affaires ici, à mon humble avis, est la discordance entre la documentation et la mise en œuvre: la Javadoc dePattern
listes de toutes les séquences d'échappement il est censé soutenir, y compris\n
et ainsi de suite, et il ne mentionne pas\v
.C'est tout. Je pense que je l'ajouter à votre réponse que c'était la chose qui me confond.
OriginalL'auteur ruakh
perldoc perlrecharclass
dit que\v
correspond à un "blanc vertical". Ceci est expliqué plus en détail:Plus précisément,
\v
matchs les caractères suivants dans 5.16:Vous pouvez utiliser un caractère de classe pour obtenir le même effet que Perl
\v
.Bien sûr, cela s'applique à Perl; je ne sais pas si elle s'applique à Java.
OriginalL'auteur Keith Thompson