如何编写一个正则表达式来匹配后面跟着空白的自由文本


How to can I write a regular expression to match free-text followed by whitespace?

很抱歉标题不好,但要在一行中理解有点复杂。

我的数据看起来像以下几行(每行单独评估):

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标志添加到正则表达式中。

示例