-1

Шаблон - /<sip:.*(\d+)/

Искомая строка - <sip:+373123456789@user=phone>

Почему захватывается только последняя цифра?

quaresma89
  • 2,207

2 Answers2

1

Потому что .* означает любое количество символов - оно и съедает плюсик и весь номер кроме последней цифры, которая попадает под (\d+) Можно написать так

/<sip:\+(\d+)/ 

тогда захватывается весь номер, но нужно что бы плюс обязательно присутствовал. Еще вариант - /<sip:.*(\d{12})/ захватит ровно 12 цифр вне зависимости от наличия плюса.

Morewind
  • 567
  • Как вариант, но лучше \d+ так как длина может варироваться – quaresma89 Jan 05 '20 at 12:59
  • А если так попробовать? /sip\D*(\d+)@/. То есть после sip может быть или нет любой символ не нумерический, а далее уже цифры любое кол-во раз – quaresma89 Jan 05 '20 at 13:00
  • Да, так будет еще лучше. – Morewind Jan 05 '20 at 13:04
1

Почему захватывается только последняя цифра?

Потому что квантификатор * по-умолчанию жадный (greedy) - он заставляет токен . матчить максимально возможное количество символов (числовые к . тоже подходят).

Есть два варианта решения:

  • сделать квантификатор ленивым (lazy), /<sip:.*?(\d+)/

  • использовать токен нечисловых символов, например /<sip:\D*(\d+)/

yar85
  • 10,940
  • Вот второй вариант как раз подходит, как раз именно на таком и я остановился – quaresma89 Jan 05 '20 at 13:05
  • @quaresma89, Еще можно [^\d]*, но \D* по идее должен быстрее работать :) Еще, может поддерживаться флаг-модификатор U который делает квантификаторы ленивыми по-умолчанию, но тогда придется поменять жадность плюса: (\d+?). Вопросительный знак после квантификатора это инверсия жадности, если я ничего не путаю. – yar85 Jan 05 '20 at 13:10