我有一个正则表达式的问题,它需要捕获已经被捕获过的子字符串...
这是我的正则表达式:
(?<domain>\w+\.\w+)($|\/|\.)
我想要递归地捕获每个子域名。例如,在这个字符串中:
test1.test2.abc.def
这个表达式会捕获test1.test2
和abc.def
,但我需要捕获:
test1.test2
test2.abc
abc.def
您知道是否有任何选项可以递归地执行此操作吗?
谢谢!
我有一个正则表达式的问题,它需要捕获已经被捕获过的子字符串...
这是我的正则表达式:
(?<domain>\w+\.\w+)($|\/|\.)
我想要递归地捕获每个子域名。例如,在这个字符串中:
test1.test2.abc.def
这个表达式会捕获test1.test2
和abc.def
,但我需要捕获:
test1.test2
test2.abc
abc.def
您知道是否有任何选项可以递归地执行此操作吗?
谢谢!
/(\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
你可以使用 已知技术来提取重叠匹配, 但是你不能依赖\b
边界,因为它们可能在非单词字符/单词字符和单词/非单词字符之间匹配。你需要左右上下文具有明确的单词边界。
使用
(?=(?<!\w)(?<domain>\w+\.\w+)(?!\w))
请查看正则表达式演示。细节如下:
(?=
- 正向前瞻,用于测试字符串中的每个位置并捕获其右侧的字符串部分
(?<!\w)
- 左侧单词边界(?<domain>\w+\.\w+)
- 组“domain”:1个或多个单词字符,.
和 1个或多个单词字符(?!\w)
- 右侧单词边界)
- 外部前瞻的结尾。另一种方法是使用点作为单词分隔符。然后使用
(?=(?<![^.])(?<domain>[^.]+\.[^.]+)(?![^.]))
请查看这个正则表达式演示。根据需要进行调整。
[a-zA-Z0-9-]
是更好的近似值。有关正确的正则表达式,请参见此答案。https://stackoverflow.com/questions/60269926/validate-format-of-subdomain/60271196#60271196 - Schwern(?R)
可能会有用。不确定你指的是什么。 - Schwern(?=(?<!\w)(\w+\.\w+)(?!\w))
- Wiktor Stribiżew