我想要一个正则表达式来获取不包含域名中特定单词的网址,但无论查询字符串或域的其他子目录中是否有该单词都是如此。此外,hrl如何启动并不重要例如,http / fttp / https /没有任何一个。我发现这个表达式^((?!foo)。)* $“)我不知道如何更改它以适应这些条件。 这些是“foo”一词的接受网址:
whatever.whatever.whatever/foo/pic
whatever.whatever.whatever?sdfd="foo"
并且不接受这些:
whatever.whateverfoo.whatever
whatever.foowhatever.whatever
whatever.foo.whatever.whatever
whatever.whatever.foo.whatever
答案 0 :(得分:1)
试试这个(explanation):
^(?:(?!foo).)*?[\/\?]
这意味着什么:
foo
准确的语法可能因您的编程语言/编辑器而异。解释链接显示了PHP示例。我使用的正则表达式元素非常常见,所以它应该适合你。如果没有,请告诉我。
此正则表达式一次只能与单个URL匹配。因此,如果您在regex101中尝试此操作,请不要一次输入所有网址。
更新:Java中的示例(现在使用turner
代替foo
):
Pattern p = Pattern.compile("^(?:(?!turner).)*?[\\/\\?].*");
System.out.println(p.matcher(
"i.cdn.turner.com/cnn/.e/img/3.0/1px.gif").matches());
System.out.println(p.matcher(
"www.facebook.com/plugins/like.php?href=http%3A%2F%2F"
+ "www.facebook.com%2Fturnerkjljl").matches());
输出:
false
true
答案 1 :(得分:0)
这是一个匹配您想要拒绝的案例
的正则表达式(?:.+://){0,1}(?<subdomain>[^.]+\.){0,1}(?<domain>[^.]*whatever[^.]*\.)(?<top>[^.]+).*
(?:)是非捕获组
(?<groupName> )
是一个命名组(对于测试非常有用,在regexhero中,您可以看到该组正在捕获的内容)
{0,1}表示0或1
。表示除新行之外的任何字符
[^。]表示除“。”之外的任何字符。
表示0或更多
表示1或更多,例如,。+表示1或多个“任何字符”
。逃脱了特殊的角色。
请参阅http://www.mikesdotnetting.com/Article/46/CSharp-Regular-Expressions-Cheat-Sheet
你可以在这里试试:http://regexhero.net/tester/
答案 2 :(得分:0)
这是你在java中的正则表达式
"^[^/?]+(?<!foo)"
说明 - 从开始搜索与/或?不匹配的字符。当它找到上述两个字符中的任何一个时,那么模式向后搜索foo的负匹配。如果找到foo,则返回false,否则为true。这是在java中。正则表达式也因语言而异。
在grep cmd(unix或shell脚本)中你必须取消以下正则表达式匹配
"^[^/?]+foo"