Шаблон - /<sip:.*(\d+)/
Искомая строка - <sip:+373123456789@user=phone>
Почему захватывается только последняя цифра?
Шаблон - /<sip:.*(\d+)/
Искомая строка - <sip:+373123456789@user=phone>
Почему захватывается только последняя цифра?
Потому что .* означает любое количество символов - оно и съедает плюсик и весь номер кроме последней цифры, которая попадает под (\d+) Можно написать так
/<sip:\+(\d+)/
тогда захватывается весь номер, но нужно что бы плюс обязательно присутствовал.
Еще вариант -
/<sip:.*(\d{12})/
захватит ровно 12 цифр вне зависимости от наличия плюса.
Почему захватывается только последняя цифра?
Потому что квантификатор * по-умолчанию жадный (greedy) - он заставляет токен . матчить максимально возможное количество символов (числовые к . тоже подходят).
Есть два варианта решения:
сделать квантификатор ленивым (lazy), /<sip:.*?(\d+)/
использовать токен нечисловых символов, например /<sip:\D*(\d+)/
[^\d]*, но \D* по идее должен быстрее работать :) Еще, может поддерживаться флаг-модификатор U который делает квантификаторы ленивыми по-умолчанию, но тогда придется поменять жадность плюса: (\d+?). Вопросительный знак после квантификатора это инверсия жадности, если я ничего не путаю.
– yar85
Jan 05 '20 at 13:10
/(?<=sip[^\d]+\+)[^@]+/или/sip[^\d]+\+\K[^@]+/– Jan 05 '20 at 12:45