Comment faire correspondre n'importe quel caractère non blanc sauf un en particulier?


111

En Perl \Scorrespond à n'importe quel caractère non blanc.

Comment puis-je faire correspondre n'importe quel caractère non blanc à l'exception d'une barre oblique inverse \?

Réponses:


154

Vous pouvez utiliser une 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 "match a, bou c"; [^abc]signifie "correspond à n'importe quel caractère sauf a, bou c".


Quand est-il ^interprété comme négation et quand comme début de ligne? À cet égard, pourquoi cela ne correspondra pas à une ligne commençant par un nombre d'espaces blancs$0~/\s*^\s/
Alexander Cska

1
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 uniquement s'il s'agit du premier caractère après le crochet ouvrant, cela annule le contenu de la classe de caractères.
Tim Pietzcker

Est-ce que la ligne de correspondance suivante qui commence par un certain nombre d'espaces blancs $0~/\s*^\s/suivie de tout caractère qui n'est pas un espace blanc
Alexander Cska

1
Cela devrait probablement être /^\s+/- au début de la ligne, suivi d'un ou plusieurs caractères d'espacement.
Tim Pietzcker

1
@AlexanderCska, avez-vous compris? La réponse ci-dessus ne renverra que la première correspondance d'une chaîne. Si vous souhaitez que toutes les correspondances soient renvoyées, ajoutez le gmodificateur. /[^\s\\]/g
Ben Carp

14

Vous pouvez utiliser une anticipation:

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

2
Il regarde devant si ce n'est pas un espace. Et puis la classe négative accepte tout (qui n'est pas un espace) sauf les caractères de votre classe.
Denis de Bernardy

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

J'avais une situation où je devais faire correspondre n'importe quel caractère non blanc ainsi que des non guillemets. Il fallait également prévoir SPACES. Ex: THIS IS A TEST, AND AGAIN. Ce qui suit a bien fonctionné pour moi (?=\S)[^"]*.
Arvo Bowen

la réponse acceptée n'a pas fonctionné pour moi, mais cela a fonctionné. J'utilisais ceci dans la recherche sublime de regex de texte
Christian Noel

5

Cela a fonctionné pour moi en utilisant sed [ Modifier: le commentaire ci-dessous indique que sed ne prend pas en charge \ 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
\scorrespond à plus que le caractère d'espace. Il inclut TAB, retour chariot de saut de ligne et autres (le nombre d' autres dépend de la saveur de l'expression régulière). C'est une invention Perl, à l'origine un raccourci pour la classe de caractères POSIX [:space:], et non prise en charge dans sed. Votre premier regex ci-dessus devrait être s/[^[:space:]g]//g.
Alan Moore

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

1

Sur mon système: CentOS 5

Je peux utiliser en \sdehors des collections, mais je dois utiliser à l' [:space:]intérieur des collections. En fait, je ne peux utiliser [:space:]que des collections internes. Donc, pour faire correspondre un seul espace en utilisant cela, 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 correspond \s
  • deuxième espace auquel je fais correspondre alternativement [[:space:]]
  • le match XI avec "tout sauf aucun espace" [^[:space:]]

Ces deux ne fonctionneront pas:

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

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

1
Depuis sed 4.4, il est apparemment toujours vrai que vous devez utiliser à la ([^[:space:]])place de ([^\s]). Je suis sur openSUSE Tumbleweed 2018 04 03.
user2394284
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.