Come abbinare qualsiasi carattere diverso da uno spazio bianco tranne uno in particolare?


111

In Perl \Scorrisponde a qualsiasi carattere diverso da spazi.

Come posso trovare una corrispondenza con qualsiasi carattere diverso da uno spazio vuoto tranne una barra rovesciata \?

Risposte:


154

Puoi usare una classe di caratteri :

/[^\s\\]/

corrisponde a tutto ciò che non è un carattere di spazio bianco né un \. Ecco un altro esempio:

[abc]significa "corrispondenza a, bo c"; [^abc]significa "trova qualsiasi carattere tranne a, bo c".


Quando viene ^interpretato come negazione e quando come inizio riga? A questo proposito, perché questo non corrisponderà a una linea che inizia con il numero di spazi bianchi$0~/\s*^\s/
Alexander Cska

1
Al di fuori di una classe di caratteri, è "l'inizio della stringa" (o riga, a seconda della modalità di corrispondenza corrente). All'interno di una classe di caratteri, e solo se è il primo carattere dopo la parentesi di apertura, nega il contenuto della classe di caratteri.
Tim Pietzcker

Sarà la seguente linea di partita che inizia con un numero di spazi bianchi $0~/\s*^\s/seguita da qualsiasi carattere che non sia uno spazio bianco
Alexander Cska

1
Probabilmente dovrebbe essere /^\s+/- inizio della riga, seguito da uno o più caratteri di spazio bianco.
Tim Pietzcker

1
@AlexanderCska, l'hai capito? La risposta precedente restituirà solo la prima corrispondenza di una stringa. Se vuoi che vengano restituite tutte le corrispondenze, aggiungi il gmodificatore. /[^\s\\]/g
Ben Carp il

14

Puoi usare un lookahead:

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

2
Guarda avanti se non è uno spazio. E poi la classe negativa accetta qualsiasi cosa (che non è uno spazio) tranne i caratteri nella tua classe.
Denis de Bernardy

Mi piace questa soluzione. Va bene per cose come "dammi tutti i caratteri non /(?=\S)\W/
alfanumerici

Ho avuto una situazione in cui avevo bisogno di abbinare qualsiasi carattere diverso da spazi e non virgolette. Doveva anche tenere conto degli SPAZI. Es: THIS IS A TEST, AND AGAIN. Quanto segue ha funzionato bene per me (?=\S)[^"]*.
Arvo Bowen

la risposta accettata non ha funzionato per me, ma questo ha funzionato. lo stavo usando nella ricerca di espressioni regolari di testo sublime
Christian Noel

5

Questo ha funzionato per me usando sed [ Modifica: il commento sotto indica che sed non supporta \ s]

[^ ]

mentre

[^\s] 

non l'ha fatto

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

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

3
\scorrisponde a più del semplice carattere spazio. Esso comprende TAB, ritorno a capo avanzamento riga, e altri (come molti altri dipende dal sapore regex). È un'invenzione di Perl, originariamente una scorciatoia per la classe di caratteri POSIX [:space:], e non supportata in sed. La tua prima espressione regolare sopra dovrebbe essere s/[^[:space:]g]//g.
Alan Moore

Sì @AlanMoore funziona: echo "ghai ghai" | sed "s/[^[:space:]g]//g" Rendimenti:g g
storm_m2138

1

Sul mio sistema: CentOS 5

Posso usare \sal di fuori delle raccolte ma devo usare [:space:]all'interno delle raccolte. Infatti posso usare [:space:]solo all'interno delle collezioni. Quindi per abbinare un singolo spazio usando questo devo usare il [[:space:]] che è davvero strano.

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

Result: a b cX
  • primo spazio con cui abbino \s
  • secondo spazio abbino alternativamente [[:space:]]
  • l'XI corrisponde a "tutto ma nessuno spazio" [^[:space:]]

Questi due non funzioneranno:

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

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

1
A partire da sed 4.4, è apparentemente ancora vero che devi usare ([^[:space:]])invece di ([^\s]). Sono su openSUSE Tumbleweed 2018 04 03.
user2394284
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.