2

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

注册:

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

例子

1212asdfasdfdasf101.102.103.asdsadasdasd

1213asdfasdfdasf104.105.106.asdsadasdasd

我想要捕获 102 和 103、105、106,但也想要捕获 1212 和 1213。如何??谢谢!

4

1 回答 1

2

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

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

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

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

但是,如果您快速查看(例如)java 文档,您会看到它说:

捕获组通过从左到右计算它们的左括号来编号

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

也就是说,除非您可以通过执行以下可怕的操作来使您的正则表达式不那么泛化(并且更丑陋):

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

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

于 2013-07-02T14:20:43.660 回答