特别是,使用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全局正则表达式匹配:只需过滤出重复的部分并使用它。我发现这比更普遍适用的*操作符更不灵活,但在大多数情况下它显然可以完成这项工作。
发布于 2012-06-29 06:40:28
与大多数其他正则表达式风格一样,JavaScript中的正则表达式只有在重复匹配捕获组的最后一个值时才会捕获它。唯一一个众所周知的regex库(据我所知)可以访问所有以前匹配的捕获是.NET中的一个。
所以不能,你不能在JS中这样做。
在Perl中,有几种方法可以完成这些任务。一种更优雅的方法可能是使用\G (它也可以在PCRE中工作)。
例如:
"Version 1.2.3.4" =~ /(?:\S+ |\G(?!^)\.)(\d+)/g返回(在列表上下文中):
(1, 2, 3, 4)发布于 2012-06-29 03:30:04
为什么不匹配整个版本字符串,然后按.拆分
>> "Version 1.2.3.4".match(/\S+ (\d+(?:\.\d+)*)/)[1].split('.')发布于 2012-06-29 03:23:37
正则表达式\.?\d+将返回您需要的内容,但您必须为所有匹配运行此正则表达式,而不仅仅是一个...
var n=str.match(/\.?\d+/g); 如果你只想匹配没有前导点的数字,那么使用正则表达式\d+。
var n=str.match(/\d+/g); https://stackoverflow.com/questions/11251465
复制相似问题