为什么" ?[^ A-Z \ - \ +]击中[^ A-Z \ - \ +]"不匹配"命中" (没有空格作为第一个字符?)

时间:2014-04-02 15:48:02

标签: php regex

我回来了一个正则表达式的问题 - 我需要测试一个字符串,用于模式的出现 - 它可以隐藏在字符串的某个地方 - 正面,正面但前面有一个空白,介于两者之间或者位于结束,也许最后是空白。

我认为这个正则表达式可能有效 - 但它没有做到这一点:

/ ?[^a-z\-\+]hit[^a-z\-\+]/

因为它只显示第一个命中,当它前面有一个空白 - 因为我用问号标记了第一部分 - 我认为第一个字符也可能被省略 - 请再次让我回到轨道上告诉我在哪里我我错了......

我在这里做了一个小提琴:http://regexr.com/38lcq(编辑:我刚尝试了“Niet the Dark Absol”的正则表达式 - 更好但仍然提供了比我想要的更多的匹配......)

1 个答案:

答案 0 :(得分:5)

它不起作用,因为您的[^a-z\-+]要求角色位于“目标”hit之前。

尝试:/\bhit\b/ - 使用\b表示字边界。

你也可以更具体:

/(?<![a-z0-9+-])hit(?![a-z0-9+-])/i

这使用负面的lookbehind和lookahead来排除你不想要的东西。