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

kor*_*bes 34 regex string

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

\d+(?!\d+)
Run Code Online (Sandbox Code Playgroud)

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

ARRAY[123]         matches 123 
ARRAY[123].ITEM[4] matches 4
B:1000             matches 1000
B:1000.10          matches 10
Run Code Online (Sandbox Code Playgroud)

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

cod*_*ict 83

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

匹配任何数字,如果没有紧跟一个数字.

哪个不对.如果没有任何其他数字跟随(跟随它,不仅仅是立即),则数字是最后一个.

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

(\d+)(?!.*\d)
Run Code Online (Sandbox Code Playgroud)

Rubular Link


saw*_*awa 10

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

/(\d+)\D*\z/
Run Code Online (Sandbox Code Playgroud)
  1. \z 在结尾意味着这是字符串的结尾.
  2. \D* 在此之前意味着任意数量的非数字可以介于匹配和字符串结尾之间.
  3. (\d+)是匹配的部分.正如卡梅伦所指出的那样,它可以在括号中找到它.


Cam*_*ron 9

您可以使用

.*(?:\D|^)(\d+)
Run Code Online (Sandbox Code Playgroud)

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

您的否定前瞻不起作用,因为在字符串"1 3"上,例如,1匹配\d+,则空格匹配负前瞻(因为它不是一个或多个数字的序列).该3是甚至从不看.

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

  • @jb:嘿,我从那开始,然后在我提出`(?:\ D | ^)`时不得不删除我的答案.`.*(\ d +)`的问题是只匹配最后一位数(因为一旦满足正则表达式,引擎就会停止,这将在回溯一个数字字符后停止) (2认同)