REGEX良好的开端,但需要一些排除

时间:2017-11-24 23:24:15

标签: regex

我有那个正则表达式

\{([^{}]|(?R))*\}

匹配最外面的括号内容

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

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

但我需要添加一些排除:

  • 绕过位于简单或双引号中的每个括号
  • 如果结束括号后跟\ s *,请不要匹配; (分号之间有任何空格)

所以下面的文字应该给出:

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

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

foo{foofoofoo} ;

//Matches nothing

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

首先,将您的模式更改为展开的版本(效率更高):

\{[^{}]*+(?:(?R)[^{}]*)*+\}

然后,按照相同的想法,您可以轻松地将部分描述为引号:

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

(同样包含单引号,从否定字符类中排除单引号并添加描述引用部分的分支)

您还可以在帐户中使用转义引号:

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

如果您不希望关闭大括号后跟;按照建议添加否定前瞻。 (?!\s+;)(?!\s*;)取决于您的需求。但是,如果您只想定位最外面的右括号,则必须使用条件语句(?(condition)then|else)(?(R)|(?!\s+;))(?(R)|(?!\s*;))