Match espaces, mais pas les retours à la ligne
J'ai parfois envie de correspondre à des espaces mais pas de saut de ligne.
Jusqu'à présent, j'ai eu recours à [ \t]
. Est-il moins difficile?
BTW, ces caractères sont aussi des "espaces":
quelqu'un est-il encore de faire la forme de flux? (\f)
N'importe qui qui a un caractère orienté vers l'imprimante. La plupart des imprimantes ont un caractère mode ainsi que le format PostScript ou quel que soit le Hewlett Packard interface est appelée, et de jeter un page, vous envoyer un formulaire de flux.
Hewlett Packard est appelé PCL (Printer Control Language).
[\r\f]
.quelqu'un est-il encore de faire la forme de flux? (\f)
N'importe qui qui a un caractère orienté vers l'imprimante. La plupart des imprimantes ont un caractère mode ainsi que le format PostScript ou quel que soit le Hewlett Packard interface est appelée, et de jeter un page, vous envoyer un formulaire de flux.
Hewlett Packard est appelé PCL (Printer Control Language).
OriginalL'auteur JoelFan | 2010-08-12
Vous devez vous connecter pour publier un commentaire.
Versions de Perl 5.10 et, plus tard, filiale de prise en charge verticale et horizontale des classes de caractères,
\v
et\h
, ainsi que le générique de l'espace de la classe\s
La solution la plus propre est d'utiliser le blanc horizontal classe de personnage
\h
. Ceci correspondra à onglet et de l'espace de l'ASCII ensemble, espace de non-rupture de ASCII étendu, ou de l'une de ces caractères UnicodeLa espace vertical modèle
\v
est moins utile, mais correspond à ces personnagesIl y a sept verticale espaces qui correspondent à
\v
et dix-huit horizontales qui correspondent à\h
.\s
correspond à vingt-trois personnagesTous les espaces sont soit verticale ou horizontale ne se chevauchent pas, mais ils ne sont pas bon sous-ensembles parce que
\h
correspond également à U+00A0 NO-BREAK SPACE, et\v
correspond également à U+0085 LIGNE SUIVANTE, qui ne sont pas accompagnés par des\s
\h
ne fonctionne que sur les langues, qui prend en chargePCRE
.Cette question est au sujet de Perl, qui certes prend en charge PCRE
Sauf que
[[:blank:]]
ne correspond pas no-break space --
ou"\xA0"
Veux mentionner que
\h
a parfaitement fonctionné pour mon cas d'utilisation qui était en train de faire un rechercher/remplacer de Notepad++ sur 1 ou plus contigus non-nouveaux en ligne des espaces. Rien d'autre (simple).Ce qui fait du Perl
\h
légèrement non-standard est l'inclusion deMONGOLIAN VOWEL SEPARATOR
. Unicode ne considère pas les espaces. Pour cette raison, Perl\h
diffère de POSIXblank
([[:blank:]]
en Perl,\p{Blank}
en Java) et Java 8\h
. Certes, c'est un cas limite.OriginalL'auteur Borodin
Utiliser un double négatif:
Qui est, non-non-blanc (la capitale S complète) ou pas-le transport-retour ou non-retour à la ligne. La distribution de l'extérieur pas (c'est à dire, le complément de
^
dans la classe de caractères) avec De Morgan, la loi de, c'est l'équivalent des “espaces blancs, mais pas de retour chariot ou saut de ligne.” Y compris les deux\r
et\n
dans le modèle gère correctement tous les Unix (LF), le classique de Mac OS (CR), et DOS-ish (CR LF) newline conventions.Pas besoin de prendre mon mot pour cela:
De sortie:
Noter l'exclusion de tabulation verticale, mais c'est adressées en v5.18.
Avant de s'opposer trop sévèrement, la documentation Perl utilise la même technique. Une note de bas de page dans le “Espaces” de la section de perlrecharclass lit
La même la section de perlrecharclass propose également d'autres approches qui ne sera pas offenser les enseignants de langues de l'opposition à double-négatifs.
À l'extérieur des paramètres régionaux et Unicode règles ou lorsque le
/a
interrupteur est en effet, “\s
correspond[\t\n\f\r ]
et, à partir de Perl v5.18, l'onglet vertical,\cK
.” Jetez\r
et\n
de quitter/[\t\f\cK ]/
pour la mise en correspondance des espaces, mais pas de saut de ligne.Si votre texte est en Unicode, utilisez un code similaire à la sous ci-dessous pour construire un modèle à partir du tableau de susmentionnés section documentation.
D'Autres Applications
Le double négatif astuce est également très pratique pour la mise en correspondance des caractères alphabétiques. Rappelez-vous que
\w
correspond à “la parole des personnages, des” caractères alphabétiques et chiffres et des caractères de soulignement. Nous laid-Américains parfois envie de l'écrire comme, disons,mais un double caractère négatif de la classe peut respecter les paramètres régionaux:
Exprimant “un caractère de mot, mais pas de chiffre ou un caractère de soulignement” de cette façon est un peu opaque. Un de caractères POSIX-classe communique l'intention plus directement
ou avec une propriété Unicode comme szbalint suggéré
ce qui est surprenant? Moins difficile que ce à quoi?
Parfaitement horrible.
C'est très bien. Comme demandé, à vous de faire correspondre les espaces (et pas seulement les espaces), et de vous exclure le caractère de saut de ligne. Votre solution ne s'intéresse pas à la question: "quels espaces existent", il ne devrait pas. C'est précisément ce que je cherchais. (Comme indiqué par @Rory, un "saut de ligne" peut également inclure
\r
, par exemple, sur Windows, pensez donc sauf ceux du match:/[^\S\r\n]/
)Vrai, sauf lorsque \h n'est pas disponible...
OriginalL'auteur Greg Bacon
Une variation sur La réponse de Greg qui comprend des retours chariot:
Cette regex est plus sûr que
/[^\S\n]/
sans\r
. Mon raisonnement est que Windows utilise\r\n
pour les retours à la ligne, et Mac OS 9 utilisé\r
. Vous avez peu de chances de trouver\r
sans\n
de nos jours, mais si vous trouvez qu'il est, il ne pouvait pas dire quoi que ce soit, mais un retour à la ligne. Ainsi, depuis\r
peut signifier un retour à la ligne, nous devrions exclure aussi.Vous pourriez être surpris de voir comment de nombreux programmes utilisent encore "\r" pour les fins de ligne. Parfois elle m'a fallu un moment pour comprendre que mon problème était que le fichier utilisé ces. Ou qu'il a utilisé le MacRoman encodage des caractères...
OriginalL'auteur Rory O'Kane
Ce que vous cherchez est la POSIX
blank
classe de personnage. En Perl, il est mentionné que:en Java (n'oubliez pas d'activer
UNICODE_CHARACTER_CLASS
):Comparativement à la même
\h
, POSIXblank
est pris en charge par un peu plus de regex moteurs (référence). Un avantage majeur est que sa définition est fixée dans Annexe C: Propriétés de Compatibilité de l'Unicode des Expressions Régulières et standards pour l'ensemble des regex saveurs qui s'en charge Unicode. (En Perl, par exemple,\h
choisit de préciser, en outre, laMONGOLIAN VOWEL SEPARATOR
.) Cependant, un argument en faveur de\h
est qu'il détecte des caractères Unicode (même si les moteurs ne sont pas d'accord sur qui), tandis que les classes de caractères POSIX sont souvent par défaut ASCII (comme en Java).Mais le problème est que même en collant Unicode ne résout pas le problème à 100%. Considérer les caractères suivants qui ne sont pas considérés comme des espaces en Unicode:
U+FEFF ZÉRO DE LA LARGEUR DE L'ESPACE INSÉCABLE
Prises de https://en.wikipedia.org/wiki/White-space_character
Ladite mongol voyelle séparateur n'est pas inclus pour ce qui est probablement une bonne raison. Il, avec 200C et 200D, se produisent à l'intérieur des mots (autant que je sache), et donc casse la règle que tous les autres espaces obéit: vous pouvez marquer avec elle. Ils ressemblent plus à des modificateurs. Cependant,
ZERO WIDTH SPACE
,WORD JOINER
, etZERO WIDTH NON-BREAKING SPACE
(si elle a utilisé autrement que comme une marque d'ordre d'octet) ajustement de l'espace de la règle dans mon livre. Donc, je inclure dans mon blanc horizontal classe de personnage.En Java:
Merci de souligner ce point. Je vais mettre à jour ma réponse. Je suis en désaccord, cependant, que ma réponse n'est pas pertinente. Ce qui est immatériel est le
perl
balise dans la question d'origine.n'est pas prise en charge en JavaScript, donc certainement pas "standard pour tous les regex saveurs" -1
Le plus instructif. Je trouve inquiétant de savoir qu'un général et complet "blanc horizontal" raccourci classe de personnage n'existe pas, et que les horreurs comme
[\p{Blank}\u200b\u180e]
sont nécessaires. Certes, il est logique qu'une voyelle séparateur est pas considéré comme un caractère d'espacement, mais pourquoi zéro-largeur de l'espace n'est pas dans les classes comme\s
et\p{Blank}
, ça me dépasse.Suivi: j'ai lu que les deux sont considérés comme limite "neutre", bien que cela n'explique pas pourquoi.
OriginalL'auteur Aleksandr Dubinsky
Ci-dessous regex correspondent à des espaces blancs, mais pas d'un caractère de nouvelle ligne.
DÉMO
Si vous souhaitez ajouter un retour chariot aussi ajouter ensuite
\r
avec le|
opérateur à l'intérieur de l'anticipation négatif.DÉMO
Ajouter
+
après le non-capture d'un groupe pour correspondre à un ou plusieurs espaces blancs.DÉMO
Je ne sais pas pourquoi vous les gens de ne pas évoquer les caractères POSIX classe
[[:blank:]]
qui correspond à n'importe quel horizontale des espaces (d'espaces et de tabulations). Cette POSIX caractère de classe de travailler sur des BRES(de Base des Expressions Régulières), ERE(une Expression Régulière Étendue), PCRE(Perl Compatible Regular Expression).DÉMO
OriginalL'auteur Avinash Raj
m//g
juste donner de l'espace dans//
, et il va fonctionner. Ou utiliser\S
— il remplace tous les caractères spéciaux comme tab, les sauts de lignes, des espaces, et ainsi de suite.OriginalL'auteur saiprathapreddy.obula