Подтвердить что ты не робот

Регулярное выражение для соответствия последнему номеру в строке

Мне нужно извлечь последнее число, которое находится внутри строки. Я пытаюсь сделать это с регулярным выражением и негативными взглядами, но он не работает. Это регулярное выражение, которое у меня есть:

\d+(?!\d+)

И это некоторые строки, просто чтобы дать вам представление и что должно соответствовать регулярное выражение:

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

И так далее. Регулярное выражение соответствует номерам, но все они. Я не понимаю, почему негативный взгляд не работает. Кто-нибудь может объяснить?

4b9b3361

Ответ 1

Ваше регулярное выражение \d+(?!\d+) говорит

соответствует любому номеру, если оно не , сразу после него.

что неверно. Номер является последним, если он не соблюдается (следуя за ним в любом месте, а не сразу) любым другим числом.

При переходе в регулярное выражение мы имеем:

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

Рублевая ссылка

Ответ 2

Я принял это так: вам нужно убедиться, что совпадение достаточно близко к концу строки; достаточно близко в том смысле, что могут вмешиваться только не цифры. Я предлагаю следующее:

/(\d+)\D*\z/
  • \z в конце означает, что это конец строки.
  • \D* до этого означает, что произвольное количество цифр не может вмешиваться между совпадением и концом строки.
  • (\d+) - соответствующая часть. Это в скобках, так что вы можете забрать его, как указал Камерон.

Ответ 3

Вы можете использовать

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

чтобы получить последнее число; это связано с тем, что совпадение будет сожрать все символы с помощью .*, затем вернуться к первому несимметричному символу или началу строки, а затем сопоставить конечную группу цифр.

Ваш отрицательный lookahead не работает, потому что в строке "1 3", например, 1 соответствует \d+, тогда пробел соответствует отрицательному lookahead (поскольку это не последовательность из одного или больше цифр). 3 даже не смотрится.

Обратите внимание, что в вашем примере regex нет групп, поэтому я не уверен, как вы извлекали номер.