Регулярное выражение для соответствия последнему номеру в строке
Мне нужно извлечь последнее число, которое находится внутри строки. Я пытаюсь сделать это с регулярным выражением и негативными взглядами, но он не работает. Это регулярное выражение, которое у меня есть:
\d+(?!\d+)
И это некоторые строки, просто чтобы дать вам представление и что должно соответствовать регулярное выражение:
ARRAY[123] matches 123
ARRAY[123].ITEM[4] matches 4
B:1000 matches 1000
B:1000.10 matches 10
И так далее. Регулярное выражение соответствует номерам, но все они. Я не понимаю, почему негативный взгляд не работает. Кто-нибудь может объяснить?
Ответы
Ответ 1
Ваше регулярное выражение \d+(?!\d+)
говорит
соответствует любому номеру, если оно не , сразу после него.
что неверно. Номер является последним, если он не соблюдается (следуя за ним в любом месте, а не сразу) любым другим числом.
При переходе в регулярное выражение мы имеем:
(\d+)(?!.*\d)
Рублевая ссылка
Ответ 2
Я принял это так: вам нужно убедиться, что совпадение достаточно близко к концу строки; достаточно близко в том смысле, что могут вмешиваться только не цифры. Я предлагаю следующее:
/(\d+)\D*\z/
-
\z
в конце означает, что это конец строки.
-
\D*
до этого означает, что произвольное количество цифр не может вмешиваться между совпадением и концом строки.
-
(\d+)
- соответствующая часть. Это в скобках, так что вы можете забрать его, как указал Камерон.
Ответ 3
Вы можете использовать
.*(?:\D|^)(\d+)
чтобы получить последнее число; это связано с тем, что совпадение будет сожрать все символы с помощью .*
, затем вернуться к первому несимметричному символу или началу строки, а затем сопоставить конечную группу цифр.
Ваш отрицательный lookahead не работает, потому что в строке "1 3", например, 1
соответствует \d+
, тогда пробел соответствует отрицательному lookahead (поскольку это не последовательность из одного или больше цифр). 3
даже не смотрится.
Обратите внимание, что в вашем примере regex нет групп, поэтому я не уверен, как вы извлекали номер.