使用正则表达式查找域部分中不包含特定单词的URL

时间:2013-09-26 17:58:34

标签: python regex

我想要一个正则表达式来获取不包含域名中特定单词的网址,但无论查询字符串或域的其他子目录中是否有该单词都是如此。此外,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

3 个答案:

答案 0 :(得分:1)

试试这个(explanation):

^(?:(?!foo).)*?[\/\?]

这意味着什么:

  1. 匹配不包含foo
  2. 的anthing
  3. 直到遇到斜线或问号
  4. 准确的语法可能因您的编程语言/编辑器而异。解释链接显示了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%2Fturnerkjl‌​jl").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"