javascript替换像{... {..} ...}这样的结构

时间:2010-12-06 03:31:56

标签: javascript regex curly-braces

我想为像

这样的平衡括号构造写一个正则表达式

{...}{... {..}...}{...{..{..}...}..{..}...}其中...表示任何没有“{”或“}”字符的文字

如果我这样做:

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

第一个}将被视为结束匹配,因此  { { } }将成为_{ { }_ }

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

PS:function(s)部分不是来自真实代码,仅举例来说 PPS:如果可能的话,我想用正则表达式来做这件事 PPPS:文本中包含的最高级别的'{'括号是有限的,通常为3或4

更新 感谢您的评论,让我们将嵌套大括号的数量限制为3.所以:

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

2 个答案:

答案 0 :(得分:2)

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

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

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

将匹配一级嵌套大括号,并且应该(相对)直接将其扩展到所需的嵌套级别数。

答案 1 :(得分:2)

  

感谢您的评论,让我们将嵌套大括号的数量限制为3。

好的,这给了我们可以用正则表达式做的事情。 (有一些诸如“扩展”正则表达式之类的东西,比如在Perl或Python中找到的,可以匹配任意嵌套大括号,通过使用一种叫做“反向引用”的东西。我不知道Javascript是否是“正则表达式“支持那些。”

我们将正则表达式分成几部分。

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

[^{}]*
好的,这很容易。任意数量的非支撑字符。 :)

因此,具有一级括号的构造看起来像

{[^{}]*}

因为我们在开始和结束时都需要大括号,而不是其他地方。

最多2个级别怎么样?

那么,我们在开始和结束时仍然有大括号,我们的内容可以是“任意数量的数据块,每个数据块都有0或1个大括号”。

所以,我们将这两个表达式与|联系在一起,将“0或1级括号”放在一起(以便我们匹配其中一个),并在括号内加上括号(因为我们想要对待它)作为一个整体单位)和a *之后表示“我们刚才在括号之间定义的任何数量的东西”。然后括号围绕整个事情。这给了:

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

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