捕获重复组参考

时间:2013-07-02 12:22:43

标签: regex

我试图用这个表达式找到数字(少于第一个),但它只适用于最后一个数字...我知道需要捕获重复组而不是重复捕获的组但我不明白它是怎么回事

REG:

(\d*)[a-zA-Z]+\d+(?:\.(\d*))*\.[a-zA-Z]+

例如

1212asdfasdfdasf101.102.103.asdsadasdasd

1213asdfasdfdasf104.105.106.asdsadasdasd

我也希望捕获102和103,105,106,但也需要1212和1213。怎么样??谢谢!

1 个答案:

答案 0 :(得分:2)

答案取决于您使用的语言。

对于大多数正则表达式,没有“简单”的答案......例如,你可能认为你可以这样做:

^(?:.*?(\d+))+

...(你希望)为每组数字创建一个新的捕获组。

但是,如果你快速查看(例如)java documentation,那么你会看到它说:

  

捕获组的编号是从左到右计算它们的左括号

即。有一个固定的号码,由您输入的多少对括号指定!因此,在大多数语言中,为了完成这项工作,您需要做的不仅仅是简单的正则表达式匹配。

也就是说,除非你可以通过做一些可怕的事情来使你的正则表达不那么普遍(而且更难看):

^(?:.*?(\d+))?(?:.*?(\d+))?(?:.*?(\d+))?(?:.*?(\d+))?

可以使用.NET或Perl 6正确执行此正则表达式匹配。