使用平衡组,很容易匹配括号。例如,使用s*\{(?:[^{}]|(?<counter>\{)|(?<-counter>\}))+(?(counter)(?!))\}
,您可以正确检查此示例中的括号:
{
{
"correct";
}
}
我遇到的一个问题是,如果内部有一个带括号的字符串,则该代码不起作用,即
{
{
"wrong}";
}
}
检查引号是否匹配并不困难,但我没有看到如何将其改编为原始正则表达式。 我如何才能使平衡组忽略字符串文字中的括号?
答案 0 :(得分:2)
正则表达式并不是您尝试做的最好的工具,但并不意味着 。
s*\{(?:"(?:(?<!\\)\\(?:\\{2})*"|[^"])*"|[^{}]|(?<counter>\{)|(?<-counter>\}))+(?(counter)(?!))\}
注意:我只是将"(?:(?<!\\)\\(?:\\{2})*"|[^"])*"|
添加到您的模式中,因此我只会解释该部分。
较短的方法(感谢PhiLho's answer on regex for a quoted string with escaping quotes)如下。
s*\{(?:"(?:[^"\\]|\\.)*"|[^{}]|(?<counter>\{)|(?<-counter>\}))+(?(counter)(?!))\}
我使用与正则表达式I recently answered another question with相同的想法并将其应用于您的。它允许转义双引号以及打开/关闭花括号。
"
按字面意思匹配(?:(?<!\\)\\(?:\\{2})*"|[^"])*
匹配以下任意一次
(?<!\\)\\(?:\\{2})*"
符合以下条件
(?<!\\)
否定的背后隐藏确保前面的内容不是字面反斜杠\
\\
匹配文字反斜杠(?:\\{2})*
匹配两个字面反斜杠(2,4,6,8等)"
按字面意思匹配[^"]
匹配除"
之外的任何字符"
按字面意思匹配 注意:(?<!\\)\\(?:\\{2})*"
可确保其正确匹配转义双引号"
。这基本上说:匹配双引号字符"
之前的任何奇数反斜杠,使\"
,\\\"
,\\\\\"
等有效,{{1} },\\"
,\\\\"
是无效的转义双引号\\\\\\"
(因此字符串终止)