我需要提取字符串中的最后一个数字.我正试图用正则表达式和负面前瞻来做这件事,但它不起作用.这是我的正则表达式:
\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)
saw*_*awa 10
我这样做了:你需要确保匹配足够接近字符串的结尾; 在某种意义上足够接近,只有非数字可以介入.我建议如下:
/(\d+)\D*\z/
Run Code Online (Sandbox Code Playgroud)
\z 在结尾意味着这是字符串的结尾.\D* 在此之前意味着任意数量的非数字可以介于匹配和字符串结尾之间.(\d+)是匹配的部分.正如卡梅伦所指出的那样,它可以在括号中找到它.您可以使用
.*(?:\D|^)(\d+)
Run Code Online (Sandbox Code Playgroud)
得到最后一个数字; 这是因为匹配器将吞噬所有字符.*,然后回溯到第一个非数字字符或字符串的开头,然后匹配最后一组数字.
您的否定前瞻不起作用,因为在字符串"1 3"上,例如,1匹配\d+,则空格匹配负前瞻(因为它不是一个或多个数字的序列).该3是甚至从不看.
请注意,您的示例正则表达式中没有任何组,因此我不确定您是如何提取该数字的.