2012-06-25 16 views
10

Próbuję określić poprawną składnię RegEx, aby wykonać następujące czynności. Mam linię w pliku, w którym chcę dopasować każdy znak przed pierwszym wystąpieniem białej spacji.RegEx - chciwy odstęp między białymi znakami

tak na przykład w linii:

123abc barze xyz foo

niejasne jest dla mnie dlaczego następujący:

^.*\s 

jest dopasowanie się do B w pasek słów:

123abc xyz foo

Wydaje mi się, że \ s jest chciwy, jednak nie jestem pewien, w jaki sposób mogę to zrobić nie chciwi i po prostu dopasować 123abc Próbowałem różnych form tego regex w celu uczynienia to nie-chciwe ^.*\s? lub coś podobnego, jednak nie udało mi się. Z góry dziękuję

+1

spróbować tego -.? '^ * \ S'. w twojej wersji jest chciwy –

+0

To jest dokładnie to czego chciałem - dziękuję obojgu - to, co myślałem, że robię, czyniło to chciwym z *, dopóki nie znajdzie pustego miejsca (z \ s), a potem umieściłbym ? po \ s, aby wskazać, że pasuje tylko 0 lub więcej razy.Rozumiem teraz - dziękuję – vloche

Odpowiedz

16

To dlatego, że . może być dowolną postacią, włączając w to spację. Można spróbować

^[^ ]*\s 

lub

^\S*\s 

zamiast.

To jest chciwy re. Ale można zrobić bez chciwy re również:

^.*?\s 

Ty błędem jest to, że zostały umieszczone ? na niewłaściwym miejscu.

Przykłady:

$ 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 

i nie-chciwy wyszukiwania z Perl:

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

Należy zauważyć, że każdy taki mecz będzie zawierał dokładnie jeden końcowy znak odstępu. –

+0

Dziękuję Igor - odpowiedziałeś na moje pierwsze pytanie, a inny na RegEx - dzięki – vloche

+0

@vloche Proszę rozważyć zaznaczenie tej odpowiedzi jako zaakceptowanej – ellockie

3

Użyj regex ^\S*(?=\s)

co oznacza wszystkie (*) Non białe znaki (\S) od samego początku (^), ale należy nadążyć za białym znakiem (\s), Ale nie jest wliczone w meczu - pozytywne uprzedzona (?=\s)

Jeśli chcesz końcowe białe znaki (ów), które należy uwzględnić, jak również, a następnie użyć regex ^\S*\s+

Powiązane problemy