我正在尝试创建一个正则表达式,该表达式将显示给定字符串中的两个子字符串,并且返回值应该是包含两个元素(两个匹配的字符串)的数组。我知道我的问题与回文紧密相关,回文不能以正则表达式实现,但是我希望正则表达式能够达到足够接近的水平,因为我希望阅读的是有限大小的结构。
具体来说,我只关心匹配两个顶级子级,如在第一个示例中一样,内部的任何数量的嵌套括号都无关紧要,无论它们是1还是99999。
请注意,空格只是为了更易于阅读,并且输入字符串将没有空格。这个结构很简单:
{ }{ }
,应接受为两个字符串:
{ } and { }
其中包含大括号的任意组合:
{ {} {} {} {} {} {} }{ {} }
,应接受为两个字符串:
{ {} {} {} {} {} {} } and { {} }
这些大括号内部分组中的任何一个都可以是无限递归分组,例如:
{{{{ }{{ }}{ }}}}{{ }{ }{ }}
,应接受为两个字符串:
{{{{ }{{ }}{ }}}} and {{ }{ }{ }}
我一个人已经考虑了这个问题很长时间了,无法提出适当的解决方案,而且我发现没有任何在线工具可以直观地看到这两个子字符串,总是只匹配整个字符串。我还使用了一些正则表达式创建者,例如“ http://regex.inginf.units.it/”,并给了它最大的字符串数和所有可能的边缘大小写等,但准确性只有40%。我希望在这个问题上比我更聪明的人可以提出一个正则表达式,以适合底部7个示例的答案以及根据上述规则构造的任何其他可能的字符串。
我制作了一个简单的html来测试我的字符串(只需在脚本标签中编辑“ reg”变量以更改您的正则表达式并使用刷新页面查看结果:
var reg = /({({.*})*})/g;
var str1 = "{}{}";
var str2 = "{{}{}}{{}}";
var str3 = "{{{{{}{}{}{}}{{}}}}{}}{}";
var str4 = "{{{{{{{{{{{{{{{{{}}{{}}}}}{{}}}}}{{}}}}}{{}}}}}{{}}}}}{{}}";
var str5 = "{{}{{{{{{}{}}}}{{{{}{}}}{}}}}{}{{{}{{}}}}}{{{{{}}{{{{}{}}}}}}{{{{}}{{{{}{}}}}}}}";
var str6 = "{{}{}}{{}{{{}{}}}}";
var str7 = "{{}{}}{{{{{}}{{}}}}{{{}{}}}}";
var s1 = document.getElementById("d1").innerHTML = str1.match(reg);
var s2 = document.getElementById("d2").innerHTML = str2.match(reg);
var s3 = document.getElementById("d3").innerHTML = str3.match(reg);
var s4 = document.getElementById("d4").innerHTML = str4.match(reg);
var s5 = document.getElementById("d5").innerHTML = str5.match(reg);
var s6 = document.getElementById("d6").innerHTML = str6.match(reg);
var s7 = document.getElementById("d7").innerHTML = str7.match(reg);
<p id="d1"></p>
<p id="ans1">{},{}</p>
<p id="d2"></p>
<p id="ans2">{{}{}},{{}}</p>
<p id="d3"></p>
<p id="ans3">{{{{{}{}{}{}}{{}}}}{}},{}</p>
<p id="d4"></p>
<p id="ans4">{{{{{{{{{{{{{{{{{}}{{}}}}}{{}}}}}{{}}}}}{{}}}}}{{}}}}},{{}}</p>
<p id="d5"></p>
<p id="ans5">{{}{{{{{{}{}}}}{{{{}{}}}{}}}}{}{{{}{{}}}}},{{{{{}}{{{{}{}}}}}}{{{{}}{{{{}{}}}}}}}</p>
<p id="d6"></p>
<p id="ans6">{{}{}},{{}{{{}{}}}}</p>
<p id="d7"></p>
<p id="ans7">{{}{}},{{{{{}}{{}}}}{{{}{}}}}</p>
答案 0 :(得分:3)
正则表达式不适用于此任务(至少不适合JS语言)。任何涉及可以任意嵌套的结构的内容都不适合与正则表达式匹配。这就是为什么他们说you should not use regex to parse HTML或JSON。有关更多信息,请参见此answer。
此处使用的字符串非常简单,无需使用正则表达式即可进行解析。通过使用正则表达式,您会让自己的生活变得艰难。
以下是解析此字符串的方法(假设方括号始终处于平衡状态):