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

问题描述 投票:0回答:4

我需要提取字符串中的最后一个数字。我正在尝试使用正则表达式和否定前瞻来做到这一点,但它不起作用。这是我的正则表达式:

\d+(?!\d+)

这些是一些字符串,只是为了给您一个想法,以及正则表达式应该匹配什么:

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

等等。正则表达式匹配数字,但匹配所有数字。我不明白为什么消极前瞻不起作用。有谁愿意解释一下吗?

regex string
4个回答
135
投票

你的正则表达式

\d+(?!\d+)

匹配任何数字,如果它不是紧随其后的数字。 这是不正确的。如果某个数字

后面没有任何其他数字(紧随其后,而不是紧随其后),则该数字是最后一个数字。 当翻译成正则表达式时,我们有:

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

圆形链接


11
投票

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

获取最后一个数字;这是因为匹配器会吞噬所有带有 
.*

的字符,然后回溯到第一个非数字字符或字符串的开头,然后匹配最后一组数字。


您的负向先行不起作用,因为在字符串“1 3”上,例如,

1

\d+
匹配,然后空格与负向先行匹配(因为它不是一个或多个数字的序列) )。
3
甚至从未被人看过。

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


11
投票

/(\d+)\D*\z/

末尾的 
    \z
  1. 表示这是字符串的结尾。
    前面的 
  2. \D*
  3. 表示在匹配和字符串结尾之间可以插入任意数量的非数字。
  4. (\d+)
  5. 是匹配部分。正如卡梅伦所指出的,它位于括号中,以便您可以拿起它。
    
        

0
投票
Inline Modifiers (?imsxXU)

)。

这符合我的目的 - 

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

© www.soinside.com 2019 - 2024. All rights reserved.