REGEX很好的开始,但需要一些

REGEX很好的开始,但需要一些,regex,Regex,我有那个正则表达式 \{([^{}]|(?R))*\} 与最外面的括号内容匹配 foo{ subfoo{ "foofoofoo..." } }foo //Matches : // { // subfoo{ // "foofoofoo..." // } //} 但我需要补充一些例外情况: 绕过位于单引号或双引号中的每个括号 如果右括号后面跟着\s*,则不匹配;分号之间有空格 因此,以下文本应给出: foo{ subfoo{

我有那个正则表达式

\{([^{}]|(?R))*\}
与最外面的括号内容匹配

foo{
    subfoo{
       "foofoofoo..."
    }
}foo

//Matches :
//   {
//   subfoo{
//      "foofoofoo..."
//   } 
//}
但我需要补充一些例外情况:

绕过位于单引号或双引号中的每个括号 如果右括号后面跟着\s*,则不匹配;分号之间有空格 因此,以下文本应给出:

foo{
   subfoo{
      "foofoofoo... { "
   }
}foo

//Matches :
//   {
//   subfoo{
//      "foofoofoo... { "
//   } 
//}


有人能帮忙吗?

首先,将图案更改为更有效的展开版本:

\{[^{}]*+(?:(?R)[^{}]*)*+\}
然后,按照同样的思路,您可以轻松地将部分描述为引号:

\{[^{}"]*+(?:"[^"]*"[^{}"]*|(?R)[^{}"]*)*+\}
同样,要包含单引号,请从否定字符类中排除单引号,并添加一个描述引用部分的分支

您还可以考虑转义引号:

\{[^{}"]*+(?:"[^"\\]*+(?s:\\.[^"\\]*)*+"[^{}"]*|(?R)[^{}"]*)*+\}

如果你不想在结束的花括号后面跟一个字母;按照建议添加一个负面前瞻\s+;还是\s*;取决于你想要什么。但是,如果您只想以最外层的结束括号为目标,那么您必须使用条件语句?conditionthen | else:?R |?检查您是否在递归中\s+;还是?R |\s*

2可以很容易地实现否定断言…\}\s+;同时,我不确定是否可以使用regexp,特别是如果我们想忽略转义引号并在双引号字符串中使用单引号,我几乎不知道regexp的基本知识。。我试过你的例子,但是他们返回了一个错误,不完整的组结构@LePioo:这是一个输入错误,这取决于你想要什么:\{[^{}]*+?:?R[^{}]**+}在括号内有一个捕获,或者如果你不需要它的话,编辑的版本。其他图案也是一样。非常感谢!我将REGEXP重新发布在演示链接\{[^{}]*+?:[^\]*+?s:\.\.\.^\]**+[^{}']*.[^'\]*+?s:\.\.^'\]**+'[^{}'].[^{}']\+'.[^{}]**+'.[^{}]**+\'.\R}上\s*;还有一个问题:您知道这个正则表达式是否可以在javascript、python甚至C上进行解释吗?@LePioo:python,仅使用。Javascript,也许可以使用它,但没有条件特性。net语言,但您必须重写模式以使用平衡组而不是递归。
\{[^{}"]*+(?:"[^"\\]*+(?s:\\.[^"\\]*)*+"[^{}"]*|(?R)[^{}"]*)*+\}