负面看起来与它之前的可变长度匹配

时间:2013-10-17 12:39:05

标签: regex regex-lookarounds

我正在尝试在地址末尾提取一个单独的#,但仅在某些指定之后才会提取。

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

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

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

123 W Somewhere St Apt # 321

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

123 W Somewhere St # 321

但是,它与上述两者相符。

我发现,如果我将[,.]? ?# ?更改为#,那就可以了。

但是,这意味着只需删除空格或在地址中添加句点就会将其丢弃。

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

在PHP 5.3中实现。

1 个答案:

答案 0 :(得分:1)

在这种情况下你不能使用lookbehind(后面有可选内容),但你可以使用这个替代方案:

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

\K之前重置所有匹配。