130 votes

Comment faire correspondre tout caractère non blanc sauf un caractère particulier ?

En Perl \S correspond à tout caractère autre qu'un espace blanc.

Comment faire correspondre tout caractère autre qu'un espace blanc, à l'exception d'une barre oblique inversée ? \ ?

172voto

Tim Pietzcker Points 146308

Vous pouvez utiliser un classe de caractères :

/[^\s\\]/

correspond à tout ce qui n'est pas un caractère d'espacement ni un \ . Voici un autre exemple :

[abc] signifie "correspondre a , b o c " ; [^abc] signifie "correspondre à tout caractère sauf a , b o c ".

0 votes

Quand est-ce que ^ interprété comme une négation et quand comme un début de ligne ? À cet égard, pourquoi ce système ne correspond-il pas à une ligne commençant par un certain nombre d'espaces blancs ? $0~/\s*^\s/

1 votes

En dehors d'une classe de caractères, c'est le "début de la chaîne" (ou de la ligne, selon le mode de correspondance actuel). À l'intérieur d'une classe de caractères, et seulement si c'est le premier caractère après la parenthèse ouvrante, il annule le contenu de la classe de caractères.

0 votes

Le texte suivant correspondra-t-il à une ligne qui commence par un certain nombre d'espaces blancs ? $0~/\s*^\s/ suivi de tout caractère qui n'est pas un espace blanc

16voto

Denis Points 34131

Vous pouvez utiliser un lookahead :

/(?=\S)[^\\]/

2 votes

On dirait que c'est en avant si ce n'est pas un espace. Et ensuite, la classe négative accepte tout ce qui n'est pas un espace, sauf les caractères de votre classe.

0 votes

J'aime cette solution. C'est bien pour des choses comme "donnez-moi tous les caractères non-mots sauf les espaces" : /(?=\S)\W/

0 votes

J'avais une situation où je devais faire correspondre tout caractère non blanc ainsi que les caractères non guillemets. Il fallait également tenir compte des ESPACES. Ex : THIS IS A TEST, AND AGAIN . Ce qui suit a bien fonctionné pour moi (?=\S)[^"]* .

11voto

storm_m2138 Points 70

Cela a fonctionné pour moi en utilisant sed [ Edit : Le commentaire ci-dessous souligne que sed ne supporte pas \s ]

[^ ]

tandis que

[^\s] 

n'a pas

# Delete everything except space and 'g'
echo "ghai ghai" | sed "s/[^\sg]//g"
gg

echo "ghai ghai" | sed "s/[^ g]//g"
g g

3 votes

\s correspond à plus que le caractère espace. Il inclut le TAB, le saut de ligne, le retour de chariot, et d'autres (comment beaucoup de d'autres dépendent de la saveur de la regex). C'est une invention de Perl, à l'origine un raccourci pour la classe de caractères POSIX [:space:] et non pris en charge dans sed . Votre première expression rationnelle ci-dessus devrait être s/[^[:space:]g]//g .

0 votes

Yup @AlanMoore fonctionne : echo "ghai ghai" | sed "s/[^[:space:]g]//g" Rendement : g g

1voto

Torge Points 1239

Sur mon système : CentOS 5

Je peux utiliser \s en dehors des collections mais doivent utiliser [:space:] à l'intérieur des collections. En fait, je peux utiliser [:space:] uniquement à l'intérieur des collections. Ainsi, pour faire correspondre un espace unique en utilisant cette méthode, je dois utiliser [[:space:]] Ce qui est vraiment étrange.

echo a b cX | sed -r "s/(a\sb[[:space:]]c[^[:space:]])/Result: \1/"

Result: a b cX
  • premier espace avec lequel je m'accorde \s
  • le deuxième espace, je le fais correspondre alternativement avec [[:space:]]
  • le X que je fais correspondre avec "tout mais pas d'espace". [^[:space:]]

Ces deux-là ne fonctionneront pas :

a[:space:]b  instead use a\sb or a[[:space:]]b

a[^\s]b      instead use a[^[:space:]]b

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