我有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个变体的正确方法是什么?
答案 0 :(得分:2)
怎么样呢?
Bank:.*{(?:\\\\)?"([^{"]*?)(?:\\\\)?":\[(?:\\\\)?"(.*?)(?:\\\\)?"\]}
或确保\\
仅成对匹配
Bank:.*{((?:\\\\)?)"([^{"]*?)\1":\[((?:\\\\)?)"(.*?)\3"\]}
请注意,在第二种情况下,您的捕获将在#2和#4组中。
您的新测试字符串仍将与上述模式匹配。如果愿意,您可以将Bank:.*
替换为Bank:[ ]
。 Demo1-Demo2。
添加了(?:\\\\)?
->一个可选的非捕获组,以匹配两个反斜杠字符。
将第一个捕获组(.*)
替换为([^{"]*?)
,以避免匹配双引号和{
字符(这对于第一个测试字符串尤其必要)。另外,通过添加?
将其从贪婪转换为惰性,以避免捕获转义字符(\\
)(如果存在)。
使第二个捕获组也变懒(.*?)
出于相同的原因。
在第二种模式中,(?:\\\\)?
被添加到捕获组,以便可以使用反向引用(即,\1
和\3
)。这样做的目的是仅在两个双引号字符都转义(以\\
开头)时匹配。