很抱歉标题不好,但要在一行中理解有点复杂。
我的数据看起来像以下几行(每行单独评估):
JOHNNY BE GOOD 2.55
Rubber Ducky (2012) 123.71
International: INT'L 29.12
我正试图将它们拆分如下:
[JOHNNY BE GOOD][ ][2.55]
[Rubber Ducky (2012)][ ][123.71]
[International: INT'L][ ][29.12]
也就是说,从左到右,尽可能多的文本(包括空格),然后是任何尾随的空格,然后是一个有两个小数位的十进制数字。
到目前为止,我有以下表达式,但我的空白区域是用文本捕获的,而不是它自己:
/(.*)('s+)([0-9]+'.[0-9]{2})/
我做错了什么?
谢谢!
您的(.*)
是贪婪的,即占用了它所能占用的所有字符。尝试使用惰性运算符?
:
/(.*?)('s+)([0-9]+'.[0-9]{2})/
或井:
/([^'s]*)('s+)([0-9]+'.[0-9]{2})/
您非常接近,但您使用的是.
字符,它将匹配包括空白在内的所有字符。只需将第一个捕获组中的[^'s]
添加到正则表达式中,使其看起来类似于以下
(.*[^'s])('s+)([0-9]+'.[0-9]{2})
http://gskinner.com/RegExr/?2vo43
我建议将('s+)
部分更改为('s{2,})
,这样可以确保有重复的空白,而不仅仅是一个字符。
您可能还想加入一些行起始/结束锚,以防止通配符"吃掉"过多的数据。为了帮助平衡这一点并使它们在换行符处匹配,请将m
标志添加到正则表达式中。
示例