正则表达式匹配字符串中的最后一个数字

时间:2011-03-16 02:51:23

标签: regex string

我需要提取字符串中的最后一个数字。我正试图用正则表达式和负面前瞻来做这件事,但它不起作用。这是我的正则表达式:

\d+(?!\d+)

这些是一些字符串,只是为了给你一个想法,以及正则表达式应该匹配的内容:

ARRAY[123]         matches 123 
ARRAY[123].ITEM[4] matches 4
B:1000             matches 1000
B:1000.10          matches 10

等等。正则表达式匹配数字,但所有这些数字。我不明白为什么负面的前瞻不起作用。有人在乎解释吗?

4 个答案:

答案 0 :(得分:74)

您的正则表达式\d+(?!\d+)

如果 紧跟 ,则

匹配任何数字。

这是不正确的。如果 没有被任何其他数字跟随(跟随它,而不仅仅是立即),则该数字是最后一个。

当翻译为正则表达式时,我们有:

(\d+)(?!.*\d)

Rubular Link

答案 1 :(得分:10)

我这样做了:你需要确保匹配足够接近字符串的结尾;在某种意义上足够接近,只有非数字可以介入。我建议如下:

/(\d+)\D*\z/
    最后
  1. \z表示这是字符串的结尾。
  2. \D*之前意味着任意数量的非数字可以介入匹配和字符串结尾之间。
  3. (\d+)是匹配部分。正如卡梅伦所指出的那样,它在括号内,你可以把它拿起来。

答案 2 :(得分:9)

您可以使用

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

获取最后一个号码;这是因为匹配器将使用.*吞噬所有字符,然后回溯到第一个非数字字符或字符串的开头,然后匹配最后一组数字。

您的否定预测不起作用,因为在字符串“1 3”上,1\d+匹配,则空格与负前瞻匹配(因为它不是一个或多个数字的序列)。 <{1}}从未被人看过。

请注意,您的示例正则表达式中没有任何组,因此我不确定您是如何提取数字的。

答案 3 :(得分:0)

我仍然无法管理捕获组 (例如,如果使用Inline Modifiers (?imsxXU))。

这对我来说有用-

(?:\ D | ^)\ d (\ D)