正则表达式:在Kleene-star表达式中获取每个匹配的匹配值?

时间:2012-06-28 19:20:58

标签: javascript regex

特别是,这可以用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 个答案:

答案 0 :(得分:3)

与大多数其他正则表达式一样,JavaScript中的正则表达式仅捕获捕获组的最后一个值(如果它重复匹配)。唯一众所周知的正则表达式lib(我知道),你可以访问所有以前匹配的捕获,是.NET中的一个。

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

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

例如:

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

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

(1, 2, 3, 4)

答案 1 :(得分:1)

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

>> "Version 1.2.3.4".match(/\S+ (\d+(?:\.\d+)*)/)[1].split('.')

答案 2 :(得分:0)

正则表达式\.?\d+将返回您所需的内容,但您必须为所有匹配运行此正则表达式,而不仅仅是一个......

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

如果您只想匹配没有前导点的数字,请使用正则表达式\d+

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

答案 3 :(得分:0)

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

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

然后只需在结果捕获上调用split