如何匹配不包含特定前缀的PCRE正则表达式中的URL

问题描述 投票:1回答:1

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

我正在尝试创建一个可以找到这样的URL但正在忽略URLS的正则表达式,其中第一组(random_chars)与'java'不匹配。

例如下面的字符串:

  • “test string(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
  • 呜呜呜.Google.com
  • GH.突然

这是我目前的正则表达式,我试图使用负向前瞻:

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

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

php regex pcre
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.