正则表达式递归捕获的字符串
Regex recursion captured string
我的正则表达式有问题,它必须捕获它已经捕获的子字符串...
我有这个正则表达式:
(?<domain>\w+\.\w+)($|\/|\.)
而且我想递归地捕获每个子域。例如,在这个字符串中:
test1.test2.abc.def
此表达式捕获 test1.test2
和 abc.def
但我需要捕获:
test1.test2
test2.abc
abc.def
你知道是否有递归执行此操作的选项吗?
谢谢!
也许 following:
(\.|^)(?=(\w+\.\w+))
继续捕获组 2
你可以用积极的眼光去捕捉下一个群体。
/(\w+)\.(?=(\w+))/g
编辑:.
请注意,\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。按您认为合适的方式进行调整。
我的正则表达式有问题,它必须捕获它已经捕获的子字符串...
我有这个正则表达式:
(?<domain>\w+\.\w+)($|\/|\.)
而且我想递归地捕获每个子域。例如,在这个字符串中:
test1.test2.abc.def
此表达式捕获 test1.test2
和 abc.def
但我需要捕获:
test1.test2
test2.abc
abc.def
你知道是否有递归执行此操作的选项吗?
谢谢!
也许 following:
(\.|^)(?=(\w+\.\w+))
继续捕获组 2
你可以用积极的眼光去捕捉下一个群体。
/(\w+)\.(?=(\w+))/g
编辑:
请注意,\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。按您认为合适的方式进行调整。