我想为像
这样的平衡括号构造写一个正则表达式 {...}
,{... {..}...}
和{...{..{..}...}..{..}...}
其中...
表示任何没有“{”或“}”字符的文字
如果我这样做:
txt.replace(/\{[\s\S]+?}/g, function(s){return "_"+s+"_";})
第一个}
将被视为结束匹配,因此
{ { } }
将成为_{ { }_ }
我想要一个正则表达式将其转换为_{ { } }_
PS:function(s)
部分不是来自真实代码,仅举例来说
PPS:如果可能的话,我想用正则表达式来做这件事
PPPS:文本中包含的最高级别的'{'括号是有限的,通常为3或4
更新 感谢您的评论,让我们将嵌套大括号的数量限制为3.所以:
{ { { .. } .. { .. } } .. { .. } }
答案 0 :(得分:2)
正则表达式无法将平衡文本与任意嵌套级别匹配。至少,不是没有非常规扩展。
但是如果嵌套的数量有限,并且您不介意解决问题的脆弱和迟钝的解决方案,那么您可以使它们工作。
/{([^{}]*{[^{}]*})*[^{}]*}/
将匹配一级嵌套大括号,并且应该(相对)直接将其扩展到所需的嵌套级别数。
答案 1 :(得分:2)
感谢您的评论,让我们将嵌套大括号的数量限制为3。
好的,这给了我们可以用正则表达式做的事情。 (有一些诸如“扩展”正则表达式之类的东西,比如在Perl或Python中找到的,可以匹配任意嵌套大括号,通过使用一种叫做“反向引用”的东西。我不知道Javascript是否是“正则表达式“支持那些。”
我们将正则表达式分成几部分。
首先,让我们弄清楚没有嵌套大括号的块是什么样的:
[^{}]*
好的,这很容易。任意数量的非支撑字符。 :)
因此,具有一级括号的构造看起来像
{[^{}]*}
因为我们在开始和结束时都需要大括号,而不是其他地方。
最多2个级别怎么样?
那么,我们在开始和结束时仍然有大括号,我们的内容可以是“任意数量的数据块,每个数据块都有0或1个大括号”。
所以,我们将这两个表达式与|
联系在一起,将“0或1级括号”放在一起(以便我们匹配其中一个),并在括号内加上括号(因为我们想要对待它)作为一个整体单位)和a *之后表示“我们刚才在括号之间定义的任何数量的东西”。然后括号围绕整个事情。这给了:
{({[^{}]*}|[^{}]*)*}
^^^^^^^^ ^^^^^^
exp. for exp. for
1 level 0 levels
将3个级别的大括号留作练习。 :)提示:我们应用相同的逻辑 - 括号包含任意数量的块,每个块最多有2个大括号。