我正在尝试确定正确的RegEx语法来执行以下操作。我在一个文件中有一行,我希望在第一次出现空格之前匹配每个字符。
所以例如在行中:
123abc xyz foo bar
我不清楚为何如下:
^.*\s
匹配单词栏中的b:
123abc xyz foo
在我看来,\ s是贪婪的,但我不确定我怎么能让它不贪婪,只是匹配123abc我尝试了各种形式的这个正则表达式,试图让它变得非贪婪{{1或类似的东西,但我没有成功。提前谢谢
答案 0 :(得分:20)
这是因为.
可以是任何角色,包括空格。你可以尝试
^[^ ]*\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
答案 1 :(得分:3)
使用正则表达式^\S*(?=\s)
从一开始(*
)表示所有(\S
)非空白字符(^
),但必须遵循空白字符(\s
),但不包括在匹配中 - 积极前瞻(?=\s)
如果您还想要包含尾随空格,请使用正则表达式^\S*\s+