捕获转义引号内的字符串
Capture strings inside escaped quotes
我有 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:.*{(?:\\)?"([^{"]*?)(?:\\)?":\[(?:\\)?"(.*?)(?:\\)?"\]}
Demo.
或者确保 \
仅成对匹配:
Bank:.*{((?:\\)?)"([^{"]*?)":\[((?:\\)?)"(.*?)"\]}
Demo.
请注意,在第二种情况下,您的捕获将在组 #2 和 #4 中。
更新:
您的新测试字符串仍会与上述模式相匹配。如果愿意,您可以将 Bank:.*
替换为 Bank:[ ]
。 Demo1 - Demo2.
说明:(对您的模式的更改)
已添加 (?:\\)?
--> 一个可选的非捕获组来匹配两个反斜杠字符。
将您的第一个捕获组 (.*)
替换为 ([^{"]*?)
以避免匹配双引号和 {
字符(这对于您的第一个测试字符串尤其必要) .此外,将其从贪婪转换为惰性(通过添加 ?
)以避免捕获转义字符(\
)(如果存在)。
出于同样的原因,也使第二个捕获组变得懒惰(.*?)
。
在第二个模式中,(?:\\)?
被添加到捕获组以便可以使用反向引用(即 </code> 和 <code>
)。这样做的目的是仅在两个双引号字符都被转义时才匹配(前面有 \
)。
我有 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:.*{(?:\\)?"([^{"]*?)(?:\\)?":\[(?:\\)?"(.*?)(?:\\)?"\]}
Demo.
或者确保 \
仅成对匹配:
Bank:.*{((?:\\)?)"([^{"]*?)":\[((?:\\)?)"(.*?)"\]}
Demo.
请注意,在第二种情况下,您的捕获将在组 #2 和 #4 中。
更新:
您的新测试字符串仍会与上述模式相匹配。如果愿意,您可以将 Bank:.*
替换为 Bank:[ ]
。 Demo1 - Demo2.
说明:(对您的模式的更改)
已添加
(?:\\)?
--> 一个可选的非捕获组来匹配两个反斜杠字符。将您的第一个捕获组
(.*)
替换为([^{"]*?)
以避免匹配双引号和{
字符(这对于您的第一个测试字符串尤其必要) .此外,将其从贪婪转换为惰性(通过添加?
)以避免捕获转义字符(\
)(如果存在)。出于同样的原因,也使第二个捕获组变得懒惰
(.*?)
。在第二个模式中,
(?:\\)?
被添加到捕获组以便可以使用反向引用(即</code> 和 <code>
)。这样做的目的是仅在两个双引号字符都被转义时才匹配(前面有\
)。