2013-10-17 3 views
1

J'essaye d'extraire un seul # sur la fin des adresses, mais seulement après certaines désignations.Négatif look derrière avec la longueur variable match avant

Voici le regex je teste:

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

Le regex devrait échouer dans ce cas:

123 W Somewhere St Apt # 321 

Le regex devrait trouver une correspondance dans ce:

123 W Somewhere St # 321 

Cependant, il correspond à la fois ci-dessus.

J'ai trouvé que si je change [,.]? ?# ? simplement # alors cela fonctionne.

Cependant, cela signifie que le simple fait de supprimer un espace ou d'ajouter un point à l'adresse le rejettera.

Comment puis-je faire fonctionner mon look négatif et permettre à mon regex de rester flexible dans ce cas?

Implémenté en PHP 5.3.

Répondre

1

Vous ne pouvez pas utiliser un lookbehind dans cette situation (avec un contenu en option après), mais vous pouvez utiliser cette alternative:

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

\K réinitialiser tous les match avant.

+0

Cela fonctionne, mais ne me permet pas de remplacer le signe # quand je l'utilise dans preg_replace(). – eComEvo

+0

@EcomEvo: Il suffit de déplacer le '\ K' avant le' # ' –

Questions connexes