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

3

我有一个正则表达式的问题,它需要捕获已经被捕获过的子字符串...

这是我的正则表达式:

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

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

test1.test2.abc.def

这个表达式会捕获test1.test2abc.def,但我需要捕获: test1.test2 test2.abc abc.def

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

谢谢!


你使用的正则表达式引擎是哪个?有些支持递归匹配。 - Schwern
那么你是说正则表达式可以匹配不属于原始文本的文本,对吗@Schwern? - Themelis
请注意,域名包括“-”,不包括“_”。 [a-zA-Z0-9-] 是更好的近似值。有关正确的正则表达式,请参见此答案。https://stackoverflow.com/questions/60269926/validate-format-of-subdomain/60271196#60271196 - Schwern
@Themelis 我在想(?R)可能会有用。不确定你指的是什么。 - Schwern
1
(?=(?<!\w)(\w+\.\w+)(?!\w)) - Wiktor Stribiżew
你有时间检查我的建议了吗?其他人的建议呢?有什么对你有用的吗? - Wiktor Stribiżew
3个回答

3
也许是以下内容:

也许是这个链接

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

使用捕获组2


1
你可以使用正向先行断言来捕获下一组内容。
/(\w+)\.(?=(\w+))/g

演示

编辑:JvdV的正则表达式更正确


请注意,\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

0

你可以使用 已知技术来提取重叠匹配, 但是你不能依赖\b边界,因为它们可能在非单词字符/单词字符和单词/非单词字符之间匹配。你需要左右上下文具有明确的单词边界。

使用

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

请查看正则表达式演示。细节如下:

  • (?= - 正向前瞻,用于测试字符串中的每个位置并捕获其右侧的字符串部分
    • (?<!\w) - 左侧单词边界
    • (?<domain>\w+\.\w+) - 组“domain”:1个或多个单词字符,. 和 1个或多个单词字符
    • (?!\w) - 右侧单词边界
  • ) - 外部前瞻的结尾。

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

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

请查看这个正则表达式演示。根据需要进行调整。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接