如何在PCRE正则表达式中不包含某些前缀的网址进行匹配

时间:2019-04-11 01:56:40

标签: php regex pcre

我有一个需要使用正则表达式过滤的字符串列表。某些字符串可能包含形式为((random_chars)。(random_chars)。(random_chars)。(random_chars ......)等形式的URL。

我正在尝试创建一个可找到此类URL的正则表达式,但忽略第一组(random_chars)与“ java”不匹配的URL。

例如下面的字符串:

  • “测试字符串(test.url.com)abcdef java.lang.Assertion uvwxyz www.google.com abcdef”

      

    我希望它与test.url.com和www.google.com匹配,但与java.lang.Assertion不匹配

  • “另一个测试字符串/abc/xyz/lib/def/GH.tr测试200。”

      

    我不希望它匹配GH.tr

我当前的正则表达式将符合以下条件:

  • test.url.com
  • java.lang.Assertion
  • www.google.com
  • GH.tr

这是我当前的正则表达式,并且我尝试使用否定的前瞻:

(?!java)(?:(?:\w+\.)+[\w]+)

我的正则表达式错过了什么?

1 个答案:

答案 0 :(得分:0)

之所以能够获得这些匹配项,是因为负前行(?!java)断言,直接在右边的不是Java。

如果位置恰好在java.lang.Assertion之前,则为假,因此不匹配。

但是随后移动到j,则断言为真,因为在右边的ava.lang.Assertion现在可以匹配。

一个选择可能是匹配您不想继续使用(*SKIP)(*FAIL)的内容。然后匹配您想要保留的内容。

\bjava(?:\.\w+)+(*SKIP)(*FAIL)|(?<!/)\b\w+(?:\.\w+)+

这将匹配

  • \bjava(?:\.\w+)+(*SKIP)(*FAIL)模式以匹配您不想保留的内容
  • |
  • (?<!/)向后看,则断言左侧不是正斜杠
  • \b\w+(?:\.\w+)+您要匹配的模式(从单词边界开始)

Regex demo | Php demo