ABAP регулярное выражение, которое считает динамические c тексты - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть строка, которая где-то содержит:

{"id":"ID_A","name":"Test","visible":false},{"id":"ID_B","name":"Hallo","visible":false},...

Я хочу заменить видимое значение ID_A, чтобы оно стало:

{"id":"ID_A","name":"Test","visible":true},{"id":"ID_B","name":"Hallo","visible":false},...

Идентификатор всегда одинаков. Я не хочу изменять видимый параметр всех других объектов (например, ID_B).

Важное замечание: значение свойства name равно Dynami c. Поэтому мне нужно некоторое регулярное выражение, которое работает для различных значений свойства имени.

Более того, я не могу ожидать, что объект ID_A всегда будет первым. Может быть, порядок может измениться.

Поскольку я не эксперт по регулярным выражениям, я был бы рад, если бы кто-то мог помочь.

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Я никогда не использовал ABAP, но общее регулярное выражение, которое может помочь вам достичь того, что вы хотите, выглядит следующим образом:

((?<="id":"ID_A").*?"visible":)false([,}].*)

Затем вам нужно заменить при использовании групп захвата в регулярном выражении.

Вы можете найти пример здесь: https://www.regextester.com/?fam=115947

Просто откройте раздел «Замена» и введите $1true$2

0 голосов
/ 22 апреля 2020

Я бы не рекомендовал регулярное выражение для разбора JSON, потому что RegEx может не работать в ряде случаев.

В ABAP нечто подобное может работать в большинстве случаев:

DATA: text TYPE string, pattern TYPE string.

pattern = '("id":"ID_A"[^}]*"visible":)false'.

text = '{"id":"ID_A","name":"Test","visible":false},'
    && '{"id":"ID_B","name":"Hallo","visible":false},...'.
REPLACE ALL OCCURRENCES OF REGEX pattern
    IN text WITH '$1true'.

Приведенное выше регулярное выражение не будет работать, если значение элемента содержит } или если где-то есть дополнительный пробел, et c.

Пояснения к регулярному выражению:

  • (...) означает регистрацию подгруппы (может быть заменено указанием $ с последующим номером подгруппы, например $1 в приведенном выше коде)
  • [^...] любой символ, которого нет в списке предлагаемых символов, например, [^}]. означает любой символ, который не является }
  • *: клинская звезда, разрешающая 0 или любое количество повторений предыдущего персонаж или группа
...