的JavaScript更换为同样的结构{... {..} ...}
我想写一个正则表达式的平衡支架结构,如的JavaScript更换为同样的结构{... {..} ...}
{...}
,{... {..}...}
和{...{..{..}...}..{..}...}
其中...
指任何文本,它没有“ {”或 '}' 字符
如果我这样做:
txt.replace(/\{[\s\S]+?}/g, function(s){return "_"+s+"_";})
第一}
将被视为结束的比赛,所以 { { } }
将成为_{ { }_ }
我想正则表达式将其转换为_{ { } }_
PS:在function(s)
部分是不是从真正的代码,只是举例
PPS:我想用正则表达式,如果能够做到这一点。
PPPS:的“{”包含在文本括号是有限的,以最高级别的3或4通常
UPDATE: 感谢的意见,让我们限制嵌套括号的数量为3。因此:
{ { { .. } .. { .. } } .. { .. } }
感谢的意见,让我们限制嵌套括号的数量为3
OK,给人的东西,我们可以用正则表达式做。 (有像Perl或Python中的“扩展”正则表达式这样的东西,可以匹配任意嵌套的大括号,通过使用称为“反向引用”。我不知道Javascript的“正则表达式”是否支持这些)
我们建立了正则表达式。
首先,让我们弄清楚什么用没有嵌套括号块的样子:
[^{}]*
OK,这很简单。任何数量的非大括号字符。 :)
一个用大括号的一个层次构建,因此,看起来像
{[^{}]*}
,因为我们想在开始和结束括号,和其他地方。
高达2层的情况如何?
那么,我们在开始和结束时仍然有大括号,我们的内容可以是“任意数量的数据块,每个数据块都有0或1级大括号”。因此,我们通过将|
(这样我们匹配一个或另一个)加入这两个表达式并放在括号中(因为我们希望将它作为一个整体来对待),将“0或1级别的大括号”放在一起单位),然后*表示“我们刚刚在括号中定义的任何数量的这个东西”。然后大括号围绕整个事情。这给了:
{({[^{}]*}|[^{}]*)*}
^^^^^^^^ ^^^^^^
exp. for exp. for
1 level 0 levels
3个级别的括号被留作练习。 :)提示:我们应用相同的逻辑 - 大括号包含任意数量的块,每个大块最多有2级大括号。
正则表达式无法将平衡文本与任意级别的嵌套匹配。至少,并非没有非正规的扩展。
但是,如果嵌套的数量有限,并且您不介意这个问题的脆弱和顽固的解决方案,那么您可以使它们工作。
/{([^{}]*{[^{}]*})*[^{}]*}/
将对阵嵌套括号的一个水平,它应该是(相对)直截了当地延伸到嵌套您需要的级别数。
如果你知道会有多少个大括号,你可以这样做。如果不是,正则表达式不能这样做。 – Gabe 2010-12-06 03:33:18
如果存在带支撑的字符串,该怎么办? – 2010-12-06 03:34:03
根据定义,未知/可变数量的平衡括号通常不足以由正则表达式处理。 :) – deceze 2010-12-06 03:34:37