忽略字符串文字中的括号

时间:2017-12-12 14:27:36

标签: .net regex parsing c#-4.0

使用平衡组,很容易匹配括号。例如,使用s*\{(?:[^{}]|(?<counter>\{)|(?<-counter>\}))+(?(counter)(?!))\},您可以正确检查此示例中的括号:

{
   {
   "correct";
   }
}

我遇到的一个问题是,如果内部有一个带括号的字符串,则该代码不起作用,即

{
    {
    "wrong}";
    }
}

检查引号是否匹配并不困难,但我没有看到如何将其改编为原始正则表达式。 我如何才能使平衡组忽略字符串文字中的括号?

1 个答案:

答案 0 :(得分:2)

正则表达式并不是您尝试做的最好的工具,但并不意味着

代码

See regex in use here

s*\{(?:"(?:(?<!\\)\\(?:\\{2})*"|[^"])*"|[^{}]|(?<counter>\{)|(?<-counter>\}))+(?(counter)(?!))\}

注意:我只是将"(?:(?<!\\)\\(?:\\{2})*"|[^"])*"|添加到您的模式中,因此我只会解释该部分。

较短的方法(感谢PhiLho's answer on regex for a quoted string with escaping quotes)如下。

See regex in use here

s*\{(?:"(?:[^"\\]|\\.)*"|[^{}]|(?<counter>\{)|(?<-counter>\}))+(?(counter)(?!))\}

说明

我使用与正则表达式I recently answered another question with相同的想法并将其应用于您的。它允许转义双引号以及打开/关闭花括号。

  • "按字面意思匹配
  • (?:(?<!\\)\\(?:\\{2})*"|[^"])*匹配以下任意一次
    • (?<!\\)\\(?:\\{2})*"符合以下条件
      • (?<!\\)否定的背后隐藏确保前面的内容不是字面反斜杠\
      • \\匹配文字反斜杠
      • (?:\\{2})*匹配两个字面反斜杠(2,4,6,8等)
      • "按字面意思匹配
    • [^"]匹配除"之外的任何字符
  • "按字面意思匹配

注意(?<!\\)\\(?:\\{2})*"可确保其正确匹配转义双引号"。这基本上说:匹配双引号字符"之前的任何奇数反斜杠,使\"\\\"\\\\\"等有效,{{1} },\\"\\\\"是无效的转义双引号\\\\\\"(因此字符串终止)