考虑动态文本的 ABAP 正则表达式

ABAP regex which considers dynamic texts

我有一个字符串,其中某处包含:

{"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 始终相同。我不想更改所有其他对象的可见参数(例如 ID_B)。

重要提示:名称 属性 的值是动态的。所以我需要一些正则表达式,它适用于名称 属性 的不同值。

此外,我不能指望 ID_A 对象总是第一个。也许顺序可以改变。

由于我不是正则表达式专家,如果有人能提供帮助,我会很高兴。

我从未使用过 ABAP,但可以帮助您实现所需目标的通用正则表达式如下所示:

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

然后您需要在使用正则表达式中的捕获组时进行替换。

您可以在此处找到示例:https://www.regextester.com/?fam=115947

只需打开 "Substitution" 部分并输入 true

我不推荐使用正则表达式进行 JSON 解析,因为正则表达式在许多情况下可能不起作用。

在 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 'true'.

如果元素值包含 },或者某处有额外的 space 等,上述正则表达式将不起作用。

正则表达式的解释:

  • (...)表示注册子组(可以用$后跟子组号代替,如上面代码中的</code>)</li> <li><code>[^...] 任何不在建议字符列表中的字符,例如[^}]. 表示任何不是 }
  • 的字符
  • * : kleene star 允许前一个字符或组重复 0 次或任意次数