正则表达式递归捕获的字符串

Regex recursion captured string

我的正则表达式有问题,它必须捕获它已经捕获的子字符串...

我有这个正则表达式:

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

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

test1.test2.abc.def

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

你知道是否有递归执行此操作的选项吗?

谢谢!

也许 following:

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

继续捕获组 2

你可以用积极的眼光去捕捉下一个群体。

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

Demonstration

编辑:.


请注意,\w+ 将无法匹配像 regex-tester.com 这样的域,并且会匹配无效的 regex_tester.com[a-zA-Z0-9-]+ 更接近正确。 .


通过在 . 上拆分并成对地遍历各个部分,可以更简单、更可靠地执行此操作。例如,在 Ruby...

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

test1.test2
test2.abc
abc.def

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

使用

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

regex demo。详情:

  • (?= - 一个积极的前瞻,可以测试字符串中的每个位置并捕获字符串右侧的部分
    • (?<!\w) - 左侧单词边界
    • (?<domain>\w+\.\w+) - 组 "domain":1+ 个单词字符,. 和 1+ 个单词字符
    • (?!\w) - 右侧单词边界
  • ) - 外部先行结束。

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

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

参见 this regex demo。按您认为合适的方式进行调整。