Необходимо сгенерировать регулярное выражение между двумя разделителями - PullRequest
0 голосов
/ 01 октября 2019

Мне нужно найти регулярное выражение, которое может дать мне строку между двумя разделителями (в данном случае @)

Я ранее использовал это (? <= @) (. *?) (? = @)</p>

Но проблема в этом

Вместо того, чтобы выбрать два токена, я получаю три токена из этой линии

UPDATE XYZ
SET EVENTTIME='21:01', DEADLINE='21:21',
COMPONENTNAME = '@token1@_some_update',checkthgis= '@token2@' WHERE TYPE='STATIC_UPDATE'
  1. token1
  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

В идеале это должно дать мне только

token1 и token2

1 Ответ

0 голосов
/ 01 октября 2019

Если вы используете (?<=@).*?(?=@), шаблон будет соответствовать любым 0+ символам как можно меньше между каждой парой @ в строке, и после сопоставления он будет продолжать поиск совпадений в том месте, где был найденпредыдущий матч и справа от него. Поскольку (?=@) - это упреждающее утверждение, утверждение нулевой ширины, регулярное выражение может начать сопоставляться с @, который только что стал конечным разделителем.

Вы можете использовать

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

См. regex demo

Соответствует:

  • (?<=@) - позиция, которой непосредственно предшествует @
  • ([^\s@]+) -Группа 1: любые 1+ символов, кроме пробелов и @
  • (?=@) - позиция, за которой сразу следует @
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...