【问题标题】:How to match URL in PCRE regex that does not contain certain prefix如何在 PCRE 正则表达式中匹配不包含特定前缀的 URL
【发布时间】:2019-04-11 01:56:40
【问题描述】:

我有一个需要使用正则表达式过滤的字符串列表。某些字符串可能包含 '(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 test 200。”

    我不希望它匹配 GH.tr

我当前的正则表达式将匹配以下内容:

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

这是我当前的正则表达式,我尝试使用负前瞻:

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

我的正则表达式遗漏了什么?

【问题讨论】:

  • 感谢 Emma,我一直在使用该工具来帮助我。你说我不想要 java 或 GH 是正确的,但我想匹配任何其他 URL 并忽略完整字符串中的任何其他内容。

标签: php regex pcre


【解决方案1】:

你得到这些匹配是因为否定的前瞻 (?!java) 断言直接在右边的不是 java。

当位置在java.lang.Assertion之前时为假,因此不匹配。

但是然后移动到j,那么断言是真的,因为右边现在是ava.lang.Assertion,所以这将匹配。

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

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

这将匹配

  • \bjava(?:\.\w+)+(*SKIP)(*FAIL) 匹配你不想保留的模式
  • |或者
  • (?&lt;!/) 负向后看,断言左边不是正斜杠
  • \b\w+(?:\.\w+)+ 要匹配的模式,以单词边界开头

Regex demo | Php demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多