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

Php 正则表达式负字符类和点星号,php,regex,pcre,Php,Regex,Pcre,我需要让下面的正则表达式工作,但有问题。是的,它正在解析HTML。不,没有更好的选择 这是正则表达式: test(.*)\/[^s].*(=|\/|Z) 我使用的是U修饰符,因此它是ungreedy,并且\是我的转义符号 插入此模式: test.com/sch/anythingwhateverZhello 结果是一场比赛,而我认为这是不应该的。捕获的是.com/sch和Z,尽管我想我特别告诉过它,它应该是一个只捕获到第一个/,所以它应该是.com,如果/后面的第一个字母是s,那么B不匹配。有

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

这是正则表达式:

test(.*)\/[^s].*(=|\/|Z)
我使用的是U修饰符,因此它是ungreedy,并且\是我的转义符号

插入此模式:

test.com/sch/anythingwhateverZhello
结果是一场比赛,而我认为这是不应该的。捕获的是.com/sch和Z,尽管我想我特别告诉过它,它应该是一个只捕获到第一个/,所以它应该是.com,如果/后面的第一个字母是s,那么B不匹配。有趣的是,当我删除[^s]时,捕获现在可以正常工作,这可能是我问题的根源。随着它的出现,星号正在吞噬第二个/,这毫无意义。我试着在星号后面加一个问号,这是对正则表达式的双重暗示,它不应该贪婪,但这没有什么区别

好的,所以我不想只排除s,而不是一个否定的字符类;我真的想排除sch,具体来说,我接下来尝试了负面展望:

test(.*)\/(?!sch).*(=|\/|Z)
同样的问题!匹配,第一个捕获是.com/sch

你知道我犯了什么错吗?我一直在使用RexV2 regex validator,因此我想到该引擎中可能存在错误,但我可以在我的实时环境中复制此问题。

test.*这是您的问题。也许应该是test[^/]*


事实上,它与test.com/sch匹配,因为。表示任何字符,然后/然后在任何东西whateverzhello中都没有s,所以它继续运行。

test.*这是您的问题。也许应该是测试[^\/]*?事实上,它与test.com/sch和then/then匹配,然后在任何东西中都没有s,所以它一直在运行。先生,你是个天才。这就解决了问题。我仍然不明白为什么ungreedy.*一开始就不停下来/事实上,当它之后没有[^s]时,它确实停了下来…,但我将把这留给进一步的学者。顺便说一句,您的修复也使前瞻工作正常。非常感谢。太好了,我会把它作为答案贴出来,你可以把你的问题标记为已解决。