我有3个字符串采用这种格式
Bank: {"955974044748481":["BANK_A"]}
{"reason": "Bank: {"455049295219902":["BANK_B"]}"}
{"reason": "Bank: {\"1876212592475597\":[\"BANK_C\"]}"}
我需要在presto SQL语句中使用一个正则表达式从这些字符串中提取bank_id
和bank_name
。
我尝试过这个正则表达式,但它只捕获前两个,而不是最后一个带有转义符的正则表达式。https://regex101.com/r/ejW68x/1
Bank: {"(.*)":["(.*)"]}
捕捉所有3种变体的正确方法是什么?
这样的东西怎么样:
Bank:.*{(?:\\)?"([^{"]*?)(?:\\)?":[(?:\\)?"(.*?)(?:\\)?"]}
演示
或者确保\
仅成对匹配:
Bank:.*{((?:\\)?)"([^{"]*?)1":[((?:\\)?)"(.*?)3"]}
演示
请注意,在第二种情况下,您的捕获将分为第2组和第4组。
更新:
您的新测试字符串仍将与上述模式相匹配。如果您愿意,可以将Bank:.*
替换为Bank:[ ]
Demo1-Demo2。
解释:(改变你的模式(
添加了
(?:\\)?
-->一个可选的非捕获组来匹配两个反斜杠字符。将第一个捕获组
(.*)
替换为([^{"]*?)
,以避免匹配双引号和{
字符(这对于第一个测试字符串尤其必要(。此外,将其从贪婪转换为懒惰(通过添加?
(,以避免捕获转义字符(\
((如果存在(。由于同样的原因,使第二捕获组
(.*?)
也变懒。在第二模式中,
(?:\\)?
被添加到捕获组,使得可以使用反向参考(即,1
和3
(。这样做的目的是只有在两个双引号字符都转义(前面是\
(时才匹配。