2012-06-25 23 views
10

Sto cercando di determinare la sintassi corretta di RegEx per eseguire quanto segue. Ho una riga in un file in cui voglio abbinare ogni carattere prima della prima occorrenza dello spazio bianco.RegEx - corrispondenza spazio bianco avido

così per esempio nella linea:

123abc xyz bar foo

non è chiaro per me perché il seguente:

^.*\s 

è la corrispondenza fino alla B in la barra di parole:

123abc xyz foo

Mi sembra che il \ s è avido, ma non sono sicuro come posso fare che non avidi e basta abbinare 123abc ho provato varie forme di questo regex nel tentativo di rendere è non-goloso ^.*\s? o qualcosa del genere, tuttavia non ho avuto successo. Grazie in anticipo

+1

provare questo -.? '^ * \ S'. nella tua versione il punto è avido –

+0

Questo è esattamente quello che volevo - grazie a entrambi - Quello che pensavo di fare era rendere il punto avido con il * finché non trova uno spazio vuoto (con il \ s) e poi vorrei posizionare il ? dopo il \ s per indicare che corrispondono solo a 0 o più volte.Capisco ora - grazie – vloche

risposta

16

Questo perché . può essere qualsiasi carattere, compreso lo spazio. Si può provare

^[^ ]*\s 

o

^\S*\s 

invece.

Questo è un re avido. Ma si può fare non avido re anche:

^.*?\s 

Si errore è che avete posto ? in un posto sbagliato.

Esempi:

$ echo aaaa bbb cccc dddd > re.txt 
$ cat re.txt 
aaaa bbb cccc dddd 
$ egrep -o '^.*\s' re.txt 
aaaa bbb cccc 
$ egrep -o '^\S*\s' re.txt 
aaaa 
$ egrep -o '^[^ ]*\s' re.txt 
aaaa 

e non avido di ricerca con il Perl:

$ perl -ne 'print "$1\n" if /^(.*?)\s/' re.txt 
aaaa 
+0

Va notato che ciascuna di queste corrispondenze includerà esattamente un carattere di spazio vuoto iniziale –

+0

Grazie Igor - hai risposto alla mia prima domanda ea un'altra in merito a RegEx - grazie – vloche

+0

@vloche Considerare questa risposta come accettata – ellockie

3

Usa espressione regolare ^\S*(?=\s)

che significano tutti (*) caratteri non spazi bianchi (\S) da fin dall'inizio (^), ma deve essere seguito come carattere degli spazi bianchi (\s), Ma non incluso nel match - lookahead positivo (?=\s)

Se si desidera spazi finali (s) da includere pure, quindi utilizzare regex ^\S*\s+