捕获转义引号内的字符串

Capture strings inside escaped quotes

我有 3 个这种格式的字符串

Bank: {"955974044748481":["BANK_A"]}
{"reason": "Bank: {"455049295219902":["BANK_B"]}"}
{"reason": "Bank: {\"1876212592475597\":[\"BANK_C\"]}"}

我需要在 presto SQL 语句中使用单个正则表达式从这些字符串中提取 bank_idbank_name

我试过这个正则表达式,但它只捕获前两个而不是最后一个具有转义字符的。 https://regex101.com/r/ejW68x/1

Bank: {"(.*)":\["(.*)"\]}

捕获所有 3 个变体的正确方法是什么?

这样的事情怎么样:

Bank:.*{(?:\\)?"([^{"]*?)(?:\\)?":\[(?:\\)?"(.*?)(?:\\)?"\]}

Demo.

或者确保 \ 仅成对匹配:

Bank:.*{((?:\\)?)"([^{"]*?)":\[((?:\\)?)"(.*?)"\]}

Demo.

请注意,在第二种情况下,您的捕获将在组 #2 和 #4 中。


更新:

您的新测试字符串仍会与上述模式相匹配。如果愿意,您可以将 Bank:.* 替换为 Bank:[ ]Demo1 - Demo2.

说明:(对您的模式的更改)

  • 已添加 (?:\\)? --> 一个可选的非捕获组来匹配两个反斜杠字符。

  • 将您的第一个捕获组 (.*) 替换为 ([^{"]*?) 以避免匹配双引号和 { 字符(这对于您的第一个测试字符串尤其必要) .此外,将其从贪婪转换为惰性(通过添加 ?)以避免捕获转义字符(\)(如果存在)。

  • 出于同样的原因,也使第二个捕获组变得懒惰(.*?)

  • 在第二个模式中,(?:\\)? 被添加到捕获组以便可以使用反向引用(即 </code> 和 <code>)。这样做的目的是仅在两个双引号字符都被转义时才匹配(前面有 \)。