首页 > 解决方案 > 需要在两个分隔符之间生成正则表达式

问题描述

我需要找到一个可以给我两个分隔符之间的字符串的正则表达式(在这种情况下为@)

我以前用过这个 (?<=@)(.*?)(?=@)

但是这个问题是

我没有选择两个令牌,而是从这条线上获得三个令牌

UPDATE XYZ
SET EVENTTIME='21:01', DEADLINE='21:21',
COMPONENTNAME = '@token1@_some_update',checkthgis= '@token2@' WHERE TYPE='STATIC_UPDATE'
  1. 令牌1
  2. _some_update',checkthgis=
  3. 令牌 2

我为此使用这个 Ansible 代码

   - name: Find the tokens (@----@) in the fileString
      set_fact:
        tokens: "{{ fileString | regex_findall(regexp)}}"
      vars:
        regexp: '(?<=\@)(.*?)(?=\@)'


    - name: Replace the token in the configuration files
      replace:
        path: "{{file}}"
        regexp: "@{{token}}@"
        replace: "{{ lookup('ini', '{{token}} type=properties file=/root/xyz/myfile.properties default=@{{token}}@')}}"
      with_items: "{{tokens}}"
      loop_control:
        loop_var: token

理想情况下,这应该只给我

令牌 1 和令牌 2

标签: regexunixansible

解决方案


如果您使用(?<=@).*?(?=@)该模式,将尽可能少地匹配字符串中每对之间的任何 0+ 字符@,并且一旦匹配,它将继续在找到前一个匹配项的位置和它的右侧查找匹配项。由于(?=@)是前瞻,零宽度断言,正则表达式可能会开始匹配@刚刚成为结束分隔符的 。

您可以使用

(?<=@)([^\s@]+)(?=@)

查看正则表达式演示

它匹配:

  • (?<=@)- 紧接在前面的位置@
  • ([^\s@]+)- 第 1 组:除空格之外的任何 1+ 个字符和@
  • (?=@)- 紧随其后的位置@

推荐阅读