如何使用Ansible regex_search获取正则匹配的第N个目标值
Ansible regex_search 提取版本号解决方案
最优稳定写法
推荐两种经过验证的实现方式,均可直接得到目标字符串:
方式1:单正则捕获(性能最优)
- debug: msg: "{{ displayversion | regex_search('\\(\\S+\\s+([^)]+)\\)', '\\1') | first }}" vars: displayversion: VRP (R) software, Version 5.170 (S5735 V200R019C00SPC500)
运行输出直接为:V200R019C00SPC500
逻辑说明:正则匹配最后一个左括号\(,跳过括号内第一个非空格字段和后续空格\S+\s+,捕获直到右括号前的所有内容([^)]+),取第一个捕获组的内容即可得到目标值。
方式2:分步处理(可读性、容错性最高)
- debug: msg: "{{ displayversion | regex_search('(?<=\\().*(?=\\))$') | split | last }}" vars: displayversion: VRP (R) software, Version 5.170 (S5735 V200R019C00SPC500)
逻辑说明:先通过前后断言提取最后一个括号内的全部内容S5735 V200R019C00SPC500,按空格拆分后取最后一个元素,即使后续括号内字段数量、空格数发生变化,只要目标值是括号内最后一个字段就可以正常匹配,更易维护。
原有写法问题说明
- 前两个正则默认匹配第一个满足条件的括号内容,所以返回第一个括号的
(R) - 第三种写法匹配行尾最后一个空格后的所有内容,所以包含了末尾的右括号,且指定捕获组后regex_search返回的是列表类型,需要额外提取列表元素再处理多余符号。
内容的提问来源于stack exchange,提问作者sloweriang
相关产品推荐
相关产品推荐

