我有那个正则表达式
\{([^{}]|(?R))*\}
匹配最外面的括号内容
foo{
subfoo{
"foofoofoo..."
}
}foo
//Matches :
// {
// subfoo{
// "foofoofoo..."
// }
//}
但我需要添加一些排除:
所以下面的文字应该给出:
foo{
subfoo{
"foofoofoo... { "
}
}foo
//Matches :
// {
// subfoo{
// "foofoofoo... { "
// }
//}
和
foo{foofoofoo} ;
//Matches nothing
有人可以帮忙吗?
答案 0 :(得分:1)
首先,将您的模式更改为展开的版本(效率更高):
\{[^{}]*+(?:(?R)[^{}]*)*+\}
然后,按照相同的想法,您可以轻松地将部分描述为引号:
\{[^{}"]*+(?:"[^"]*"[^{}"]*|(?R)[^{}"]*)*+\}
(同样包含单引号,从否定字符类中排除单引号并添加描述引用部分的分支)
您还可以在帐户中使用转义引号:
\{[^{}"]*+(?:"[^"\\]*+(?s:\\.[^"\\]*)*+"[^{}"]*|(?R)[^{}"]*)*+\}
如果您不希望关闭大括号后跟;
按照建议添加否定前瞻。 (?!\s+;)
或(?!\s*;)
取决于您的需求。但是,如果您只想定位最外面的右括号,则必须使用条件语句(?(condition)then|else)
:(?(R)|(?!\s+;))
或(?(R)|(?!\s*;))