正则表达式:始终匹配所有内容,但忽略在特定位置找到特殊字符串

时间:2014-04-08 21:47:05

标签: regex

我有一些剥离的网址

en/Category/Games/TMNT/L-Michelangelo/Donatello-Groupie-Ice/p/1-23-Raphael;jsessionid=F9877C7888FFC882
en/Category/Comics/Mortal-Combat/KO/Finish-Him/p/1111111-300-Y-E-S
en/Category/Games/Dark-Knight/L-Batman/Joker-110/p/123-456-Green
en/Category/Games/Pokemon/Co-Nintendo/M-Set/p/7143499-990-Pokeball
en/Category/Games/Battlefield/c/2142

Normaly我使用它来匹配它们:

/^en\/(.+)$/

或者也许:

/^en\/Category\/Games\/(.+)$/

仅匹配游戏。

这非常好用!

但是现在,我注意匹配所有内容,但不包含"第四个网址目录"中包含宠物小精灵 Mortal-Combat 的网址。

像这样,尝试使用(?!Test)。 *用brakets制作它;

/^en\/(.+)\/(.+)\/[(?!Pokemon).*|(?!Mortal-Combat).*]\/(.+)$/

但它不起作用。

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

这应该做你想要的......

^en\/([^\/]+)\/([^\/]+)\/(?!Pokemon)(?!Mortal-Combat)([^\/]+)\/(.+)$

Regular expression visualization

首先,在大多数情况下,不要捕获.+,因为它会一直捕获到行尾,而是捕获[^\/]+(不是正斜杠,1次或更多次),所以它在这种情况下,限制你想要的边界捕获。

其次,负向前瞻不会在执行时移动光标,因此它们只是相互坐在一起,就像说下一个字符不是Pokemon和下一个字符(仍然没有移动光标)不是Mortal-Combat

最后一个捕获组捕获所有内容,直到字符串结束。

如果你想捕获Mortal-Combat-II而不是Mortal-Combat,那么在负向前瞻的末尾添加一个转义斜杠,这样它只会查找以匹配文本结尾的匹配...

(?!Pokemon\/)(?!Mortal-Combat\/)

Debuggex Demo

答案 1 :(得分:0)

尝试使用此正则表达式来获取除了包含" Pokemon"或"凡人战斗":

(?!.*Pokemon|.*Mortal-Combat)^en\/(.+)$

请参阅演示:http://regex101.com/r/fB5uD6

注意:我已经在您的问题中监督了第四个网址目录上的。所以这个正则表达式将检查一个url是否没有任何地方的

答案 2 :(得分:0)

这会限制搜索只在第4个“插槽”中使用Pokémon或Mortal-Combat过滤那些行

/^en\/(?!([^\/]+\/){2}(Pokemon|Mortal-Combat)\/)/