【问题标题】:Regex recursion captured string正则表达式递归捕获的字符串
【发布时间】:2020-06-04 11:33:03
【问题描述】:

我遇到了一个正则表达式的问题,它必须捕获已经捕获的子字符串...

我有这个正则表达式:

(?<domain>\w+\.\w+)($|\/|\.)

我想递归地捕获每个子域。例如,在这个字符串中:

test1.test2.abc.def

此表达式捕获 test1.test2abc.def 但我需要捕获: test1.test2 test2.abc abc.def

您知道是否有任何选项可以递归地执行此操作吗?

谢谢!

【问题讨论】:

  • 您使用的是什么正则表达式风格?有些支持递归匹配。
  • 所以你是说正则表达式可能首先匹配不属于该文本的文本@Schwern?
  • 请注意,域名包括-,不包括_[a-zA-Z0-9-] 是一个更好的近似值。请参阅此答案以获取正确的正则表达式。 stackoverflow.com/questions/60269926/…
  • @Themelis 我在想(?R) 可能有用。不知道你指的是什么。
  • (?=(?<!\w)(\w+\.\w+)(?!\w))

标签: regex regex-group capturing-group


【解决方案1】:

也许是following

(\.|^)(?=(\w+\.\w+))

使用捕获组 2

【讨论】:

    【解决方案2】:

    您可以使用积极的前瞻性来捕捉下一组。

    /(\w+)\.(?=(\w+))/g
    

    Demonstration

    编辑:JvdV's regex is more correct


    请注意,\w+ 将无法匹配 regex-tester.com 之类的域,并将匹配无效的 regex_tester.com[a-zA-Z0-9-]+ 更接近正确。 See this answer for a complete regex.


    通过拆分. 并成对地遍历各个部分,这样做更简单、更健壮。例如,在 Ruby 中...

    "test1.test2.abc.def".split(".").each_cons(2) { |a|
      puts a.join(".")
    }
    
    test1.test2
    test2.abc
    abc.def
    

    【讨论】:

      【解决方案3】:

      您可以使用well-known technique to extract overlapping matches,但不能依赖\b 边界,因为它们可以匹配非单词/单词字符和单词/非单词字符。左右手上下文需要明确的单词边界。

      使用

      (?=(?<!\w)(?<domain>\w+\.\w+)(?!\w))
      

      请参阅regex demo。详情:

      • (?= - 正向前瞻,可以测试字符串中的每个位置并捕获字符串右侧的部分
        • (?&lt;!\w) - 左侧单词边界
        • (?&lt;domain&gt;\w+\.\w+) - 组“域”:1+ 字字符,. 和 1+ 字字符
        • (?!\w) - 右侧单词边界
      • ) - 外部前瞻结束。

      另一种方法是使用点作为单词分隔符。然后使用

      (?=(?<![^.])(?<domain>[^.]+\.[^.]+)(?![^.]))
      

      this regex demo。根据需要进行调整。

      【讨论】:

        猜你喜欢
        • 2012-08-20
        • 1970-01-01
        • 1970-01-01
        • 2016-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-15
        • 1970-01-01
        相关资源
        最近更新 更多