如何编写正则表达式来匹配自由文本后跟空格?

时间:2012-01-16 16:51:33

标签: php regex

对不好的标题感到抱歉,但是在一行中遇到它有点复杂。

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

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]

即,从左到右,尽可能多的文本(包括空格),然后是任何尾随的空格,然后是带小数点后2位的十进制数。

到目前为止,我有以下表达式,但我的白色空间是用文本捕获的:

/(.*)(\s+)([0-9]+\.[0-9]{2})/

我做错了什么?

谢谢!

3 个答案:

答案 0 :(得分:2)

你的(.*)正在贪婪,即正在拍摄所有可能的角色。尝试使用懒惰运算符?

/(.*?)(\s+)([0-9]+\.[0-9]{2})/

或者好:

/([^\s]*)(\s+)([0-9]+\.[0-9]{2})/

答案 1 :(得分:1)

你非常接近,但你正在使用.字符,它将匹配包括空格在内的所有内容。只需将第一个捕获的组中的[^\s]添加到正则表达式中,这样就可以看起来像这样

(.*[^\s])(\s+)([0-9]+\.[0-9]{2})

http://gskinner.com/RegExr/?2vo43

答案 2 :(得分:0)

我建议将(\s+)部分更改为(\s{2,}),以确保重复空格,而不仅仅是单个字符。

您也可能想要引入一些行开始/结束锚点以防止通配符“吃掉”太多数据。为了帮助平衡这一点并让它们在换行符处匹配,请将m标记添加到正则表达式中。

Example