我需要提取字符串中的最后一个数字。我正试图用正则表达式和负面前瞻来做这件事,但它不起作用。这是我的正则表达式:
\d+(?!\d+)
这些是一些字符串,只是为了给你一个想法,以及正则表达式应该匹配的内容:
ARRAY[123] matches 123
ARRAY[123].ITEM[4] matches 4
B:1000 matches 1000
B:1000.10 matches 10
等等。正则表达式匹配数字,但所有这些数字。我不明白为什么负面的前瞻不起作用。有人在乎解释吗?
答案 0 :(得分:74)
您的正则表达式\d+(?!\d+)
说
匹配任何数字。
这是不正确的。如果 没有被任何其他数字跟随(跟随它,而不仅仅是立即),则该数字是最后一个。
当翻译为正则表达式时,我们有:
(\d+)(?!.*\d)
答案 1 :(得分:10)
我这样做了:你需要确保匹配足够接近字符串的结尾;在某种意义上足够接近,只有非数字可以介入。我建议如下:
/(\d+)\D*\z/
\z
表示这是字符串的结尾。\D*
之前意味着任意数量的非数字可以介入匹配和字符串结尾之间。(\d+)
是匹配部分。正如卡梅伦所指出的那样,它在括号内,你可以把它拿起来。答案 2 :(得分:9)
您可以使用
.*(?:\D|^)(\d+)
获取最后一个号码;这是因为匹配器将使用.*
吞噬所有字符,然后回溯到第一个非数字字符或字符串的开头,然后匹配最后一组数字。
您的否定预测不起作用,因为在字符串“1 3”上,1
与\d+
匹配,则空格与负前瞻匹配(因为它不是一个或多个数字的序列)。 <{1}}从未被人看过。
请注意,您的示例正则表达式中没有任何组,因此我不确定您是如何提取数字的。
答案 3 :(得分:0)
我仍然无法管理捕获组
(例如,如果使用Inline Modifiers (?imsxXU)
)。
这对我来说有用-
。(?:\ D | ^)\ d (\ D)