查找与给定字符串中的两个子子字符串匹配的正则表达式

时间:2019-02-17 08:07:48

标签: javascript regex regular-language

我正在尝试创建一个正则表达式,该表达式将显示给定字符串中的两个子字符串,并且返回值应该是包含两个元素(两个匹配的字符串)的数组。我知道我的问题与回文紧密相关,回文不能以正则表达式实现,但是我希望正则表达式能够达到足够接近的水平,因为我希望阅读的是有限大小的结构。

具体来说,我只关心匹配两个顶级子级,如在第一个示例中一样,内部的任何数量的嵌套括号都无关紧要,无论它们是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>

1 个答案:

答案 0 :(得分:3)

正则表达式不适用于此任务(至少不适合JS语言)。任何涉及可以任意嵌套的结构的内容都不适合与正则表达式匹配。这就是为什么他们说you should not use regex to parse HTML或JSON。有关更多信息,请参见此answer

此处使用的字符串非常简单,无需使用正则表达式即可进行解析。通过使用正则表达式,您会让自己的生活变得艰难。

以下是解析此字符串的方法(假设方括号始终处于平衡状态):

  • 遍历字符串
  • 如果遇到大括号,请将其添加到计数器变量
  • 如果遇到右括号,请减去
  • 计数器变量第一次到达0时,即第一个子字符串的末尾,其余部分为第二个子字符串。