2013-02-28 97 views
1

我需要得到以下正则表达式才能工作,但有问题。是的,它解析HTML。不,没有更好的选择。正则表达式否定字符类和点星号

这是正则表达式:

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

我使用了 “U” 修饰符(所以它的ungreedy),和 “\” 是我逃生的象征。

堵在这个模式:

test.com/sch/anythingwhateverZhello 

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

OK,所以不是一个否定的字符类(我真的不想,只排除“S”,我真的想排除“SCH”专),我明年受审负前瞻:

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

同样的问题!匹配和第一次捕获是“.com/sch”。

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

+1

'测试(。*)'这是你的问题。也许它应该是'test([^ \ /] *)'?它的方式是匹配'test.com/sch'和'/',然后在'anythingwhateverZhello'中没有's',所以它一直在继续。 – Shef 2013-02-28 20:06:59

+1

先生,你是个天才。这解决了它。我仍然不明白为什么不符合(*)不会停在第一个“/”(事实上,确实如此,当它后面没有[^ s]时......),但我会离开为进一步的学者。顺便说一句,你的修补程序也使得前瞻性的工作。谢谢! – FoulFoot 2013-02-28 20:18:57

+0

太好了,我会将其作为答案发布,并且您可以将问题标记为已解决。 – Shef 2013-02-28 20:20:16

回答

0

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

是,它的匹配test.com/sch,因为.指任何字符的方式,然后/再有就是在anythingwhateverZhello没有s,所以它一直持续。