0

我想为平衡大括号结构写一个正则表达式,比如

{...}, where表示任何没有“{”或“}”字符的{... {..}...}文本{...{..{..}...}..{..}...}...

如果我这样做:

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

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

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

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

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

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

4

2 回答 2

2

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

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

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

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

于 2010-12-06T03:38:48.523 回答
2

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

好的,这给出了我们可以用正则表达式做的事情。(有诸如“扩展”正则表达式之类的东西,例如在 Perl 或 Python 中发现的,可以通过使用称为“反向引用”的东西来匹配任意嵌套的大括号。我不知道 Javascript 的“正则表达式”是否支持这些,虽然.)

我们分段构建正则表达式。

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

[^{}]*

好的,这很容易。任意数量的非大括号字符。:)

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

{[^{}]*}

因为我们希望在开头和结尾处使用大括号,而不是其他地方。

最多2级怎么样?

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

因此,我们通过将这两个表达式与|(以便我们匹配一个或另一个)连接起来,将“0 或 1 级大括号”放在一起,并在其周围加上括号(因为我们想将其视为一个整体)和 *之后表示“我们刚刚在括号之间定义的任何数量的这个东西”。然后大括号围绕着整个事情。这给出了:

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

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

于 2010-12-06T03:43:44.417 回答