正则表达式负字符类和点星号

时间:2013-02-28 19:59:29

标签: php regex pcre

我需要让以下正则表达式工作但有问题。是的,它正在解析HTML。不,没有更好的选择。

这是正则表达式:

test(.*)\/[^s].*(=|\/|Z)

我正在使用“U”修饰符(因此它不合适),而“\”是我的转义符号。

插入这种模式:

test.com/sch/anythingwhateverZhello

比赛中的结果,当我认为不应该。捕获是“.com / sch”和“Z”,虽然我(想)我特意告诉它应该A)只捕获到第一个“/”,所以它应该是“.com”,和B)如果“/”后的第一个字母是“s”,则不匹配。有趣的是 - 以及我的问题的可能来源 - 当我删除[^ s]时,捕获现在可以正常工作。有了它,星号就会吞噬到第二个“/”,这没有任何意义。我尝试在星号后加上一个问号,就像正则表达式的一个双重暗示,它不应该是贪婪的,但这没有任何区别。

好的,所以不是一个否定的角色类(我真的不想只排除“s”;我真的想排除“sch”,我接下来尝试了一个否定的预测:

test(.*)\/(?!sch).*(=|\/|Z)

同样的问题!匹配,首先捕获的是“.com / sch”。

我的错误在哪里? (我一直在http://www.rexv.org/使用RexV2正则表达式验证器,因此我发现该引擎中可能存在错误,但我可以在我的实时环境中复制此问题。)

1 个答案:

答案 0 :(得分:0)

test(.*)这是你的问题。也许它应该是测试([^ /] *)?

就是这样,它匹配test.com/sch,因为.表示任何字符,然后是/,然后s中没有anythingwhateverZhello,所以它继续前进。