RegEx - жадный пробел

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

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

123abc xyz foo bar

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

^.*\s

соответствует строке b в строке слова:

123abc xyz foo

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

Ответ 1

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

^[^ ]*\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

Ответ 2

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

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

Если вы хотите, чтобы конечные пробелы были включены, используйте regex ^\S*\s+