的JavaScript更换为同样的结构{... {..} ...}

问题描述:

我想写一个正则表达式的平衡支架结构,如的JavaScript更换为同样的结构{... {..} ...}

{...}{... {..}...}{...{..{..}...}..{..}...}其中...指任何文本,它没有“ {”或 '}' 字符

如果我这样做:

 
    txt.replace(/\{[\s\S]+?}/g, function(s){return "_"+s+"_";}) 

第一}将被视为结束的比赛,所以 { { } }将成为_{ { }_ }

我想正则表达式将其转换为_{ { } }_

PS:在function(s)部分是不是从真正的代码,只是举例
PPS:我想用正则表达式,如果能够做到这一点。
PPPS:的“{”包含在文本括号是有限的,以最高级别的3或4通常

UPDATE: 感谢的意见,让我们限制嵌套括号的数量为3。因此:

{ { { .. } .. { .. } } .. { .. } }

+5

如果你知道会有多少个大括号,你可以这样做。如果不是,正则表达式不能这样做。 – Gabe 2010-12-06 03:33:18

+0

如果存在带支撑的字符串,该怎么办? – 2010-12-06 03:34:03

+4

根据定义,未知/可变数量的平衡括号通常不足以由正则表达式处理。 :) – deceze 2010-12-06 03:34:37

感谢的意见,让我们限制嵌套括号的数量为3

OK,给人的东西,我们可以用正则表达式做。 (有像Perl或Python中的“扩展”正则表达式这样的东西,可以匹配任意嵌套的大括号,通过使用称为“反向引用”。我不知道Javascript的“正则表达式”是否支持这些)

我们建立了正则表达式。

首先,让我们弄清楚什么用没有嵌套括号块的样子:

[^{}]* 

OK,这很简单。任何数量的非大括号字符。 :)

一个用大括号的一个层次构建,因此,看起来像

{[^{}]*} 

,因为我们想在开始和结束括号,和其他地方。

高达2层的情况如何?

那么,我们在开始和结束时仍然有大括号,我们的内容可以是“任意数量的数据块,每个数据块都有0或1级大括号”。因此,我们通过将|(这样我们匹配一个或另一个)加入这两个表达式并放在括号中(因为我们希望将它作为一个整体来对待),将“0或1级别的大括号​​”放在一起单位),然后*表示“我们刚刚在括号中定义的任何数量的这个东西”。然后大括号围绕整个事情。这给了:

{({[^{}]*}|[^{}]*)*} 
    ^^^^^^^^ ^^^^^^ 
exp. for exp. for 
1 level 0 levels 

3个级别的括号被留作练习。 :)提示:我们应用相同的逻辑 - 大括号包含任意数量的块,每个大块最多有2级大括号。

正则表达式无法将平衡文本与任意级别的嵌套匹配。至少,并非没有非正规的扩展。

但是,如果嵌套的数量有限,并且您不介意这个问题的脆弱和顽固的解决方案,那么您可以使它们工作。

/{([^{}]*{[^{}]*})*[^{}]*}/ 

将对阵嵌套括号的一个水平,它应该是(相对)直截了当地延伸到嵌套您需要的级别数。