2013-10-17 41 views
1

我试图提取一个孤立的#地址的末尾,但只有如果不是在某些指定后。负面看后面的可变长度匹配之前它

这里是我的测试正则表达式:

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

正则表达式应该在这种情况下失败:

123 W Somewhere St Apt # 321 

正则表达式应该找到这个匹配:

123 W Somewhere St # 321 

但是,它与上述两者匹配。

我发现,如果我将[,.]? ?# ?更改为简单#,那么它的工作原理。

但是,这意味着简单地删除一个空格或添加一个句点到地址将抛出它。

如何让我的负面后台工作,并让我的正则表达式在这种情况下保持灵活性?

在PHP 5.3中实现。

回答

1

不能使用在这种情况回顾后(使用后可选内容),但你可以用这个替代:

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

\K之前重置所有比赛。

+0

这是有效的,但不允许我在preg_replace()中使用它时替换#号。 – eComEvo

+0

@EcomEvo:在'#'之前移动'\ K', –