【问题标题】:Regex, ignore results with preceding character正则表达式,忽略带有前面字符的结果
【发布时间】:2023-03-23 19:55:01
【问题描述】:

我有一个用于匹配 URL ((https?:\/\/)?[\w-]+(\.[\w-]+)+\.?(:\d+)?(\/\S*)?) 的正则表达式,它可以完成这项工作,它可以满足我的需求。但是,当我不想要它时,它也会匹配电子邮件的域。

当前匹配:

  • http://www.foo.bar
  • foo.bar
  • 网站:foo.bar(匹配 foo.bar 部分)
  • info@foo.bar(匹配 foo.bar 部分)

我不希望它匹配最后一个,所以它只匹配前三个。我尝试将(?!=@) 添加到前面,但没有这样做。如何让它忽略以 @ 符号开头的结果?

【问题讨论】:

    标签: php regex


    【解决方案1】:

    在你的正则表达式中添加锚

    ^((https?:\/\/)?[\w-]+(\.[\w-]+)+\.?(:\d+)?(\/\S*)?)$
    

    查看示例http://regex101.com/r/lI8kZ6/1

    解释

    ^ 在行首断言正则表达式

    $ 在行尾断言正则表达式

    编辑

    如果网址嵌入在文本中,请使用\s 将正则表达式匹配字符串删除为

    (\s|^)((https?:\/\/)?[\w-]+(\.[\w-]+)+\.?(:\d+)?(\/\S*)?)\s
    

    查看示例

    http://regex101.com/r/lI8kZ6/3

    【讨论】:

    • 我确实希望它能够匹配部分行,但我已经更新了问题以包含我需要匹配的第三个示例。是否有任何标签可以匹配一行中的 url(整个单词)?我试过\b 而不是^$,但是没有用。
    • 检查答案中的编辑 \b cannot be used as @ 也被视为单词边界
    【解决方案2】:

    仅当您的字符串 only 包含您要匹配的 URL 时,锚点才会起作用。可能不是这样的。

    相反,您真正想要的是匹配 URL 之前有空格(或没有空格)的位置。试试:

    (?:^|(?<=\s))YOUR REGEX HERE
    

    这将检查您已经拥有的正则表达式之前是否没有任何内容或空格字符。

    Demo on regex101

    考虑进一步将(?=\s|$) 添加到正则表达式的末尾,以确保它不匹配半个单词。

    【讨论】:

    • 谢谢,正是我想要的。
    【解决方案3】:
    ^((https?:\/\/)?[\w-]+(\.[\w-]+)+\.?(:\d+)?(\/[\S]*)?)$
    

    只需添加锚点即可删除部分匹配。启用mmultliline 标志。查看演示。

    http://regex101.com/r/sU3fA2/43

    【讨论】:

    • 谢谢,但我需要匹配我已添加到问题中的第三种情况。你知道我如何将整个单词作为字符串的一部分进行匹配吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 2022-12-31
    • 1970-01-01
    • 2016-03-30
    相关资源
    最近更新 更多