Отрицательный вид сзади с совпадением переменной длины перед ним

Я пытаюсь извлечь одинокий # в конце адресов, но только если не после определенных обозначений.

Вот регулярное выражение, которое я тестирую:

/(?<!apt|appt|appartment|ste|suite|box)[,.]? ?# ?([0-9]+)$/i

В этом случае регулярное выражение должно завершиться ошибкой:

123 W Somewhere St Apt # 321

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

123 W Somewhere St # 321

Тем не менее, он соответствует обоим вышеперечисленным.

Я обнаружил, что если я заменю [,.]? ?# ? на просто #, то это сработает.

Однако это означает, что простое удаление пробела или добавление точки к адресу приведет к его сбою.

Как мне заставить мой негативный просмотр работать и позволить моему регулярному выражению оставаться гибким в этом случае?

Реализовано в PHP 5.3.


person eComEvo    schedule 17.10.2013    source источник


Ответы (1)


Вы не можете использовать просмотр назад в этой ситуации (с необязательным содержимым после), но вы можете использовать эту альтернативу:

/(?!\b(?:apt|appt|appartment|ste|suite|box))\b\w+[,.]? ?# ?\K[0-9]+/i

\K сбросить все матчи до этого.

person Casimir et Hippolyte    schedule 17.10.2013
comment
Это работает, но не позволяет мне заменить знак #, когда я использую его в preg_replace(). - person eComEvo; 17.10.2013
comment
@EcomEvo: просто переместите \K перед # - person Casimir et Hippolyte; 17.10.2013