【问题标题】:Regex to match unescaped pairs of braces正则表达式匹配未转义的大括号对
【发布时间】:2015-11-05 05:43:55
【问题描述】:

我目前正在尝试制作一个正则表达式来匹配最接近的一对左括号和右括号,而不匹配转义大括号。 (并且在非转义括号前没有匹配双转义字符)。

{"asd"} - {"asd"}
\{"test"} - No match
\\{"Apple juice}"} - {"Apple juice}"}
{{"Test"}} - {"Test"}

我已经很高兴找到一个不使用\K只处理未转义字符的正则表达式@我尝试了多种方法,但我无法弄清楚为什么这个正则表达式不起作用:((?<!\\)(?=(?:\\{2})*)){

【问题讨论】:

标签: regex regex-lookarounds


【解决方案1】:

你可以使用

(?<!\\)\\[{}]|(\{(?:"[^"\\]*(?:\\.[^"\\]*)*"|[^{}]*)(?:\\.(?:"[^"\\]*(?:\\.[^"\\]*)*"|[^{}]*))*})

regex demo

正则表达式匹配 2 个替代项:

  • (?&lt;!\\)\\[{}] - 前面没有\ 的转义开括号或闭括号

OR(这个被抓到了,所以你可以通过访问第一个捕获组来抓取它)

  • (\{(?:"[^"\\]*(?:\\.[^"\\]*)*"|[^{}]*)(?:\\.(?:"[^"\\]*(?:\\.[^"\\]*)*‌​"|[^{}]*))*}) - 匹配并捕获到第 1 组 以开头的子字符串
    • \{ - 左大括号
    • (?:"[^"\\]*(?:\\.[^"\\]*)*"|[^{}]*) - 一个带引号的字符串,包含任何转义序列("[^"\\]*(?:\\.[^"\\]*)*") 或除 {} ([^{}]*) 之外的 0 个或多个字符
    • (?:\\.(?:"[^"\\]*(?:\\.[^"\\]*)*‌​"|[^{}]*))* - 匹配 0 个或多个...
      • \\. - 转义序列
      • (?:"[^"\\]*(?:\\.[^"\\]*)*‌​"|[^{}]*) - 见上面的描述
  • } - 右大括号

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多