Expression régulière: trouver des espaces (tabulations / espace) mais pas de nouvelles lignes

96

Comment puis-je avoir une expression régulière qui teste les espaces ou les tabulations mais pas les nouvelles lignes. J'ai essayé \smais j'ai découvert qu'il testait aussi les nouvelles lignes.

J'utilise C # / WPF mais cela ne devrait pas avoir d'importance.

Jiew Meng
la source

Réponses:

189

Utilisez des classes de caractères: [ \t]

Lekensteyn
la source
1
Spot sur mon problème. Voir aussi stackoverflow.com/a/25956935/292060 pour une \hclasse de caractères uniquement perl , mais cela montre qu'il existe de nombreux autres caractères d'espacement, au cas où vous auriez besoin de les ajouter à la liste ici.
goodeye
3
pourquoi devrait-il y avoir un espace avant \t?
Ooker
4
@Ooker Pour capturer un espace littéral
codemonkee
Cela ne correspondra pas aux autres types d'espaces, comme d'autres réponses l'ont mentionné.
Gus
1
Pourquoi un espace avant \ t?
Catbuilts
35

Essayez ce jeu de caractères:

[ \t]

Cela ne correspond qu'à un espace ou à un tabulateur.

Gombo
la source
14

Comme @ Eiríkr Útlendi l'a noté, la solution acceptée ne considère que deux caractères d'espace blanc: la tabulation horizontale (U + 0009) et un espace de rupture (U + 0020). Il ne prend pas en compte les autres caractères d'espacement tels que les espaces insécables (qui se trouvent dans le texte que j'essaie de traiter). Une liste plus complète de caractères d'espaces blancs est incluse sur Wikipedia et également référencée dans la réponse Perl liée . Une solution C # simple qui tient compte de ces autres caractères peut être construite en utilisant la soustraction de classe de caractères

[\s-[\r\n]]

ou, y compris la solution d'Eiríkr Útlendi, vous obtenez

[\s\u3000-[\r\n]]
erdomke
la source
3

Remarque: Pour ceux qui traitent du texte CJK (chinois, japonais et coréen), l'espace sur deux octets (Unicode \u3000) n'est pas inclus dans \sles implémentations que j'ai essayées jusqu'à présent (Perl, .NET, PCRE, Python). Vous devrez soit normaliser vos chaînes en premier (par exemple en remplaçant tout \u3000par \u0020), soit utiliser un jeu de caractères qui inclut ce point de code en plus de tout autre espace blanc que vous ciblez, tel que [ \t\u3000].

Si vous utilisez Perl ou PCRE, vous avez la possibilité d'utiliser le \hraccourci pour les espaces blancs horizontaux , qui semble inclure l'espace sur un octet, l'espace sur deux octets et la tabulation, entre autres. Pour plus de détails, reportez-vous au thread Match whitespace but not newlines (Perl) .

Cependant, ce \hraccourci n'a pas été implémenté pour .NET et C #, comme j'ai pu le dire.

Eiríkr Útlendi
la source
1
Bon point. Java \h(introduit dans Java 8) inclut \u3000, mais \spas, sauf si vous définissez le mode UNICODE_CHARACTER_CLASS (introduit dans Java 7).
Alan Moore
0

Si vous souhaitez remplacer l' espace sous le code a fonctionné pour moi dansC#

Regex.Replace(Line,"\\\s","");

Pour Tab

Regex.Replace(Line,"\\\s\\\s","");

Sameer Bahad
la source