所以我的main.yml文件使用的是vars + regex_replace过滤器,我看到的是我没有响应或匹配的字符串被取出,剩下的都剩下了...
hosts: jenkinsservers
vars:
teamname: "{{ inventory_hostname | regex_replace('(?<=\\-)(.*?)(?=\\.)', '\\1') }}"
示例主机:
jenkins-team1.example.com
结果:团队名称继续为jenkins-team1.example.com
但是,如果我删除'\ 1',只留下
"{{ inventory_hostname | regex_replace('(?<=\\-)(.*?)(?=\\.)') }}"
然后,团队名称var产生jenkins-.example.com
所以我相信正则表达式可以按预期匹配“ team1”,为什么\ 1不能使整个var只是捕获的字符串?
答案 0 :(得分:1)
如果您想使用replace
和向后引用使输出等于捕获的字符串,那么您应该 match 匹配-
和匹配.
之后的所有内容,而不是使用lookbehind和lookahead(整个匹配项将被第二个参数替换):
regex_replace('.+-(.*?)\\..+', '\\1')
当您像以前一样使用向后搜索和向前搜索时,只有实际匹配的字符(即捕获组中的字符)才被替换。环顾四周本身并不匹配字符,它们只是在字符串中标识位置。
比较
https://regex101.com/r/lGUp0X/1
(匹配team
并将team
替换为team
(捕获的第一个组,换句话说,不变)
使用
https://regex101.com/r/lGUp0X/2
(匹配整个字符串,并将其替换为第一个捕获的组team
)