0

我想要一个正则表达式来获取在其域名中不包含特定单词的网址,但无论查询字符串或域的其他子目录中是否有该单词。此外,hrl 如何开始也无关紧要http/fttp/https/ 没有任何一个。我找到了这个表达式 ^((?!foo).)*$") 我不知道我应该如何改变它以适应这些条件。这些是“foo”这个词的可接受的 url:

whatever.whatever.whatever/foo/pic
whatever.whatever.whatever?sdfd="foo"

这些不被接受:

whatever.whateverfoo.whatever
whatever.foowhatever.whatever
whatever.foo.whatever.whatever
whatever.whatever.foo.whatever
4

3 回答 3

1

试试这个(解释):

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

这基本上意味着:

  1. 匹配不包含的东西foo
  2. 直到遇到斜线或问号

精确的语法可能因您的编程语言/编辑器而异。解释链接显示了 PHP 示例。我使用的正则表达式元素很常见,所以它应该适合你。如果没有,请告诉我。

此正则表达式一次只能匹配一个 URL。因此,如果您在 regex101 中尝试此操作,请不要一次输入所有 URL。


更新: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
于 2013-09-26T18:09:21.870 回答
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/

于 2013-09-26T18:12:59.417 回答
0

这是你在java中的正则表达式

"^[^/?]+(?<!foo)"

说明 - 从头开始​​搜索与 / 或 ? 不匹配的字符。当它找到上述两个字符中的任何一个时,模式就会向后搜索 foo 的否定匹配。如果找到 foo 则返回 false 否则返回 true。这是在java中。此外,正则表达式会因语言而异。

在 grep cmd(unix 或 shell 脚本)中,您必须否定以下正则表达式匹配

"^[^/?]+foo"
于 2013-09-26T18:35:09.450 回答