捕获转义引号中的字符串



我有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:.*{(?:\\)?"([^{"]*?)(?:\\)?":[(?:\\)?"(.*?)(?:\\)?"]}

演示

或者确保\仅成对匹配:

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

演示

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


更新:

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

解释:(改变你的模式(

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

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

  • 由于同样的原因,使第二捕获组(.*?)也变懒。

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

相关内容

  • 没有找到相关文章

最新更新