Expressão regular para corresponder ao último número em uma string

Eu preciso extrair o último número que está dentro de uma string. Estou tentando fazer isso com regex e lookaheads negativos, mas não está funcionando. Este é o regex que eu tenho:

\d+(?!\d+) 

E essas são algumas strings, só para você ter uma ideia, e o que a regex deve corresponder:

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

E assim por diante. O regex coincide com os números, mas todos eles. Eu não entendo porque o lookahead negativo não está funcionando. Alguém se importa em explicar?

Seu regex \d+(?!\d+) diz

coincidir com qualquer número, se não for imediatamente seguido por um número.

que está incorreto. Um número é o último se não for seguido (seguindo-o em qualquer lugar, não apenas imediatamente) por qualquer outro número.

Quando traduzido para regex, temos:

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

Link Rubular

Tomei assim: você precisa ter certeza de que a correspondência esteja próxima o suficiente do final da string; perto o suficiente no sentido de que apenas os não-dígitos podem intervir. O que eu sugiro é o seguinte:

 /(\d+)\D*\z/ 
  1. \z no final significa que esse é o final da string.
  2. \D* antes disso significa que um número arbitrário de não dígitos pode intervir entre a correspondência e o final da sequência.
  3. (\d+) é a parte correspondente. Está entre parênteses para que você possa pegá-lo, como foi apontado por Cameron.

Você pode usar

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

para obter o último número; isso ocorre porque o matcher englobará todos os caracteres com .* , retornará ao primeiro caractere não-dígito ou ao início da string e depois corresponderá ao grupo final de dígitos.

Seu lookahead negativo não está funcionando porque na string “1 3”, por exemplo, o 1 é correspondido por \d+ , então o espaço corresponde à lookahead negativo (já que não é uma sequência de um ou mais dígitos). O 3 nunca é nem olhado.

Observe que seu exemplo de expressão regular não possui grupos, portanto, não tenho certeza de como você estava extraindo o número.