JavaScript中regexp的奇怪行为

时间:2013-02-08 10:56:22

标签: javascript regex

我编写了一个简单的JavaScript函数来将文件名分成几部分:给定一个'image01.png'类型的文件名,它将它分成'image','01','png'。

为此,我使用以下正则表达式:

var reg = /(\D+)(\d+).(\S+)$/;

这很有效。

但是,我希望能够将这样的东西分开:day12Image01.png到'day12Image','01','png'。一般来说,我希望有任意数量的附加数字与身体相关联,只要它们不在扩展之前。

我尝试过:

var reg = /(.+)(\d+).(\S+)$/;

或替代方案:

var reg = /(\S+)(\d+).(\S+)$/;

令我感到困惑(对我而言),如果我将这些正则表达式应用于'image01.png',我会得到以下分解:'image0','1','png'。

为什么在这些情况下将'0'分配给正文而不是数字索引?

感谢您的反馈。

3 个答案:

答案 0 :(得分:1)

尝试使用非贪婪的正则表达式/(\S+?)(\d+).(\S+)$/。据我所知,这应该适用于javascript。

答案 1 :(得分:0)

这是一个可能正常的正则表达式:

/^(.+?)(\d+)\.(\S+)$/

注意,您应该转义一个点.字符,否则正则表达式会将其视为'any character'(所谓的 “特殊点” )。

答案 2 :(得分:0)

默认情况下,捕获组是贪婪的,它们会尽可能多地捕获,并且由于+表示一个或多个,它可以匹配最后一个数字并将第一个数字保留到.\S。使用?

让他们不贪心
var reg = /(.+?)(\d+).(\S+)$/;

或者

var reg = /(\S+?)(\d+).(\S+)$/;