RegEx - 贪婪的白色空间匹配

时间:2012-06-25 19:15:34

标签: regex

我正在尝试确定正确的RegEx语法来执行以下操作。我在一个文件中有一行,我希望在第一次出现空格之前匹配每个字符。

所以例如在行中:

  

123abc xyz foo bar

我不清楚为何如下:

^.*\s

匹配单词栏中的b:

  

123abc xyz foo

在我看来,\ s是贪婪的,但我不确定我怎么能让它不贪婪,只是匹配123abc我尝试了各种形式的这个正则表达式,试图让它变得非贪婪{{1或类似的东西,但我没有成功。提前谢谢

2 个答案:

答案 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+