¿Cómo hacer coincidir cualquier carácter que no sea un espacio en blanco, excepto uno en particular?

111

En Perl \Scoincide con cualquier carácter que no sea un espacio en blanco.

¿Cómo puedo hacer coincidir cualquier carácter que no sea un espacio en blanco, excepto una barra invertida \?

Lazer
fuente

Respuestas:

154

Puedes usar una clase de personaje :

/[^\s\\]/

coincide con cualquier cosa que no sea un carácter de espacio en blanco ni un \. Aquí hay otro ejemplo:

[abc]significa "coincidencia a, bo c"; [^abc]significa "coincidir con cualquier carácter excepto a, bo c".

Tim Pietzcker
fuente
¿Cuándo se ^interpreta como negación y cuándo como comienzo de línea? En ese sentido, ¿por qué esto no coincide con una línea que comienza con un número de espacios en blanco?$0~/\s*^\s/
Alexander Cska
1
Fuera de una clase de caracteres, es el "comienzo de la cadena" (o línea, según el modo de coincidencia actual). Dentro de una clase de carácter, y solo si es el primer carácter después del corchete de apertura, niega el contenido de la clase de carácter.
Tim Pietzcker
¿Coincidirá la siguiente línea que comienza con varios espacios en blanco $0~/\s*^\s/seguidos de cualquier carácter que no sea espacios en blanco
Alexander Cska
1
Probablemente debería ser /^\s+/: comienzo de línea, seguido de uno o más caracteres de espacio en blanco.
Tim Pietzcker
1
@AlexanderCska, ¿lo has descubierto? La respuesta anterior solo devolverá la primera coincidencia de una cadena. Si desea que se devuelvan todas las coincidencias, agregue el gmodificador. /[^\s\\]/g
Ben Carp
14

Puede utilizar una búsqueda anticipada:

/(?=\S)[^\\]/
Denis de Bernardy
fuente
2
Mira hacia adelante si no es un espacio. Y luego la clase negativa acepta cualquier cosa (que no sea un espacio) excepto los personajes de tu clase.
Denis de Bernardy
Me gusta esta solucion Es bueno para cosas como "dame todos los caracteres no-palabra, excepto espacios en blanco":/(?=\S)\W/
jocull
Tuve una situación en la que necesitaba hacer coincidir cualquier carácter sin espacios en blanco y sin comillas. También tenía que permitir ESPACIOS. Ej THIS IS A TEST, AND AGAIN. : . Lo siguiente funcionó bien para mí (?=\S)[^"]*.
Arvo Bowen
la respuesta aceptada no funcionó para mí, pero esto sí. Estaba usando esto en una búsqueda de expresiones regulares de texto sublime
Christian Noel
5

Esto funcionó para mí usando sed [ Editar: el comentario a continuación señala que sed no admite \ s]

[^ ]

mientras

[^\s] 

no

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

echo "ghai ghai" | sed "s/[^ g]//g"
g g
storm_m2138
fuente
3
\scoincide con algo más que el carácter de espacio. Incluye TAB, retorno de carro de avance de línea, y otros (cómo muchos otros dependen del sabor de expresiones regulares). Es una invención de Perl, originalmente una forma abreviada de la clase de caracteres POSIX [:space:], y no es compatible con sed. Su primera expresión regular anterior debería ser s/[^[:space:]g]//g.
Alan Moore
Sí, @AlanMoore trabaja: echo "ghai ghai" | sed "s/[^[:space:]g]//g" Rendimientos:g g
storm_m2138
1

En mi sistema: CentOS 5

Puedo usar \sfuera de colecciones pero tengo que usar [:space:]dentro de colecciones. De hecho, [:space:]solo puedo usar colecciones internas. Entonces, para hacer coincidir un solo espacio usando esto, tengo que usar [[:space:]] Lo que es realmente extraño.

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

Result: a b cX
  • primer espacio con el que coincido \s
  • segundo espacio con el que coincido alternativamente [[:space:]]
  • el XI coincide con "todo menos ningún espacio" [^[:space:]]

Estos dos no funcionarán:

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

a[^\s]b      instead use a[^[:space:]]b
Torge
fuente
1
A partir de sed 4.4, aparentemente sigue siendo cierto que debe usar en ([^[:space:]])lugar de ([^\s]). Estoy en openSUSE Tumbleweed 2018 04 03.
user2394284