Регулярное выражение для совпадения с последним числом в строке - PullRequest
33 голосов
/ 16 марта 2011

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

\d+(?!\d+)

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

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

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

Ответы [ 3 ]

77 голосов
/ 16 марта 2011

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

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

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

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

Рубулярная ссылка

10 голосов
/ 16 марта 2011

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...