2012-06-25 2 views
10

Я пытаюсь определить правильный синтаксис RegEx для выполнения следующих действий. У меня есть строка в файле, в котором я хочу сопоставить каждый символ перед первым появлением пробела.RegEx - greedy white space match

так, например, в строке:

123abc хуг Foo бар

непонятно мне, почему следующее:

^.*\s 

сопрягает до Ь в строка слова:

123abc хуг Foo

Мне кажется, что \ s жаден, но я не уверен, как я могу сделать это не жадный и просто соответствуют 123abc Я пробовал различные формы этого регулярного выражения в попытке сделать это не жадный ^.*\s? или что-то в этом роде, однако я не увенчался успехом. Заранее спасибо

+1

попробовать это -.? '^ * \ S'. в вашей версии точка жадна –

+0

Это именно то, что я хотел - спасибо вам обоим. То, что я думал, что я делаю, делало точку жадным с * до тех пор, пока не найдет пустое место (с \ s), а затем я бы разместил ? после того, как \ s укажет, что соответствует только 0 или более раз.Теперь я понимаю - спасибо – vloche

ответ

16

Это потому, что . может быть любым персонажем, включая космос. Вы можете попробовать

^[^ ]*\s 

или

^\S*\s 

вместо этого.

Это жадный ре. Но вы можете сделать нежадным ре также:

^.*?\s 

Вы ошибка состоит в том, что вы разместили ? на неправильном месте.

Примеры:

$ 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 

И не жадный поиск с Perl:

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

Следует отметить, что каждый такой матч будет содержать ровно один символ пробега в конце –

+0

Спасибо, Игорь - ты ответил на мой первый вопрос и другой вопрос относительно RegEx - спасибо – vloche

+0

@vloche Пожалуйста, отметьте этот ответ как принятый – ellockie

3

Использование регулярных выражений ^\S*(?=\s)

Что означают все (*) неметаллы пробельные символы (\S) с самого начала (^), но для этого должен быть символ пробела (\s), Но не включенные в матче - положительный опережения (?=\s)

Если вы хотите конечные пробелы (ы) должны быть включены, а также, а затем использовать регулярное выражение ^\S*\s+