【问题标题】:Regular expression ignore string if starts with specific substring如果以特定子字符串开头,则正则表达式忽略字符串
【发布时间】:2021-08-09 16:53:05
【问题描述】:

我需要用正则表达式查找不以字符串“http”开头的域名。例如:

我找到了一个几乎可以做到的正则表达式:

(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-]{,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}

但它也检测到“https://domain1.com”

给出的示例:

https://regex101.com/r/DjDBrx/1/

在本例中,我想避免使用“https://domain1.com”

任何帮助将不胜感激。

【问题讨论】:

  • 您是否在验证完整的字符串?还是从较长的文本中提取?
  • 欢迎来到 SO!你想要/^(?!http)/ 还是/\b(?!http)/? {,61}和{2,6}我看不懂,而且你的模式里面也没有http,所以好像和你写的规范没有关系。
  • @WiktorStribiżew 我从较长的文本中提取
  • 我会使用 \b(?<!https:\/\/)(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}\b 之类的东西,一个带有单词边界的后视。
  • @WiktorStribiżew 完成!感谢您的帮助正则表达式老板:)

标签: regex


【解决方案1】:

您可以使用单词边界加上两个否定的lookbehinds:

\b(?<!http:\/\/)(?<!https:\/\/)(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}\b
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                                ^^

(?&lt;!http:\/\/)(?&lt;!https:\/\/) 是两个负面的lookbehinds,它们将在字符串内的同一位置触发(因为lookarounds 是非消耗模式)并且-在确保位置由于\b而位于单词边界之后-它们如果当前位置的左侧紧邻有http:// 或https://,则匹配失败。

【讨论】:

    【解决方案2】:

    您可以使用负前瞻,我认为这通常是最快的选择。 如果包含您要排除的字符串,则返回负数,例如: ^(?!(http)).*

    【讨论】:

    • 完整的正则表达式如何?不知道在哪里添加它。
    • @Daniel 整个正则表达式将是“^(?!(http:))”。它将返回不包含“http:”的所有内容
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    • 2014-03-04
    • 2017-09-17
    相关资源
    最近更新 更多