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+