特别是,这可以用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
全局正则表达式匹配:只过滤掉重复和使用它的部分。我发现这比较普遍适用的*
运算符灵活性稍差,但在大多数情况下显然会完成工作。
答案 0 :(得分:3)
所以不,你不能在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
。