对不好的标题感到抱歉,但是在一行中遇到它有点复杂。
我的数据看起来像以下几行(每个都单独评估):
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})/
我做错了什么?
谢谢!
答案 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})
答案 2 :(得分:0)
我建议将(\s+)
部分更改为(\s{2,})
,以确保重复空格,而不仅仅是单个字符。
您也可能想要引入一些行开始/结束锚点以防止通配符“吃掉”太多数据。为了帮助平衡这一点并让它们在换行符处匹配,请将m
标记添加到正则表达式中。