ansible中的regex_replace不会用捕获组1替换字符串

时间:2018-08-02 03:49:00

标签: regex ansible

所以我的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只是捕获的字符串?

1 个答案:

答案 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