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 \?

Lazer
la source

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".

Tim Pietzcker
la source
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)[^\\]/
Denis de Bernardy
la source
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
tempête_m2138
la source
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
Torge
la source
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