【问题标题】:Regex matching if maximum two occurrences of dot and dash如果最多出现两次点和破折号,则正则表达式匹配
【发布时间】:2011-07-01 11:11:26
【问题描述】:

我需要一个正则表达式来匹配最多包含 2 个破折号和 2 个点的任何字符串。 不必有破折号或点,但如果有 3 个以上的破折号 3 个点,甚至 3 个以上的破折号和 3 个以上的点,则正则表达式不能与字符串匹配。

旨在用于 PHP。
我知道使用 PHP 函数的简单替代方案,但它用于只允许使用正则表达式进行过滤的大型系统。

将匹配的示例字符串:
hello-world.com

不匹配的示例字符串:
www.hello-world.easy.com hello-world-i-win.com

【问题讨论】:

  • 您能解释一下为什么需要这样的要求吗?您是否正在尝试验证网址?
  • 我看不出一个多于两个点的 URL 是如何无效的 :-) 但是,它是用于过滤 OUT url,它们过于复杂且似乎是自动生成的。

标签: php regex


【解决方案1】:

这符合您的期望吗?

(?!^.*?([.-]).*\1.*\1.*$)^.*$

here on Regexr

(?!^.*?([.-]).*\1.*\1.*$) 是负前瞻。它匹配第一个 .- 并将其放入捕获组 1,然后使用 hte 反向引用 \1 检查是否还有两个。一旦找到三个,表达式将不再匹配。

^.*$ 匹配从头到尾的所有内容,如果未匹配到负前瞻。

【讨论】:

    【解决方案2】:

    使用这个:(?!^.*?([-.])(?:.*\1){2}.*$)^.*$

    【讨论】:

      【解决方案3】:

      这个经过测试的正则表达式可以解决问题:

      $re = '/# Match string with 2 or fewer dots or dashes
          ^                            # Anchor to start of string.
          (?=[^.]*(?:\.[^.]*){0,2}$)   # Assert 2 or fewer dots.
          (?=[^\-]*(?:-[^\-]*){0,2}$)  # Assert 2 or fewer dashes.
          .*                           # Ok to match string.
          $                            # Anchor to end of string.
          /sx';
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-19
        • 2021-07-09
        • 2018-11-15
        • 1970-01-01
        • 2012-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多