2

特别是,这可以用 Javascript 实现吗?

>> "Version 1.2.3.4".match(/\S+ (\d+)(\.\d+)*/)
["Version 1.2.3.4", "1", ".4"]

很明显,$2 被设置为最后一个 Kleene-“匹配”。是否没有内置方法来检索其余部分(".2"".3")?

如果这不能在 JS 中轻松完成,Perl 可以做到吗?

更新:到目前为止,许多答案都是“解决方法”,因为我的示例很简单。如果我想匹配的重复部分不仅仅是一个数字,它们就不起作用。

但是,确实存在一个非常有效的解决方案:使用/expr/g全局正则表达式匹配:只需过滤掉重复的部分并使用它。我发现这与更普遍适用的*运算符相比不太灵活,但在大多数情况下它显然可以完成工作。

4

4 回答 4

3

JavaScript 中的正则表达式与大多数其他正则表达式风格一样,仅在重复匹配时捕获捕获组的最后一个值。唯一一个众所周知的正则表达式库(据我所知)是 .NET 中的一个,您可以在其中访问所有以前匹配的捕获。

所以不,你不能在 JS 中这样做。

在 Perl 中有几种方法可以完成这些事情。更优雅的一种可能是使用\G(它也适用于 PCRE)。

例如:

"Version 1.2.3.4" =~ /(?:\S+ |\G(?!^)\.)(\d+)/g

返回(在列表上下文中):

(1, 2, 3, 4)
于 2012-06-28T22:40:27.553 回答
1

为什么不匹配整个版本字符串,然后拆分.

>> "Version 1.2.3.4".match(/\S+ (\d+(?:\.\d+)*)/)[1].split('.')
于 2012-06-28T19:30:04.237 回答
0

正则表达式\.?\d+会返回你所需要的,但你必须为所有匹配运行这个正则表达式,而不仅仅是一个......

var n=str.match(/\.?\d+/g); 

如果您只想匹配没有前导点的数字,请使用 regex \d+

var n=str.match(/\d+/g); 
于 2012-06-28T19:23:37.417 回答
0

只需捕获整个版本号字符串,然后在句点字符上拆分。

用于匹配整数的正则表达式:/((?:\d+)(?:\.\d+)*)/

然后只需调用split生成的捕获。

于 2012-06-28T19:26:46.470 回答