Javascript 查找与给定字符串中的两个子字符串匹配的正则表达式
我试图创建一个正则表达式,它将显示给定字符串中的两个子字符串,返回值应该是一个包含两个元素的数组,两个匹配的字符串。我知道我的问题与回文的问题密切相关,回文的问题不能作为正则表达式实现,但我希望正则表达式能够足够接近,因为我希望能够阅读有限大小的结构 非常具体地说,我只关心匹配两个顶级子级,就像第一个示例中一样,内部任何数量的嵌套括号都无关紧要,不管它们是1个还是99999个 请注意,间距只是为了更易于阅读,输入字符串将没有空格。这种结构很简单:Javascript 查找与给定字符串中的两个子字符串匹配的正则表达式,javascript,regex,regular-language,Javascript,Regex,Regular Language,我试图创建一个正则表达式,它将显示给定字符串中的两个子字符串,返回值应该是一个包含两个元素的数组,两个匹配的字符串。我知道我的问题与回文的问题密切相关,回文的问题不能作为正则表达式实现,但我希望正则表达式能够足够接近,因为我希望能够阅读有限大小的结构 非常具体地说,我只关心匹配两个顶级子级,就像第一个示例中一样,内部任何数量的嵌套括号都无关紧要,不管它们是1个还是99999个 请注意,间距只是为了更易于阅读,输入字符串将没有空格。这种结构很简单: { }{ } 并应被接受为两个字符串: { }
{ }{ }
并应被接受为两个字符串:
{ } and { }
{ {} {} {} {} {} {} } and { {} }
{{{{ }{{ }}{ }}}} and {{ }{ }{ }}
其中可以包含任意数量的大括号分组:
{ {} {} {} {} {} {} }{ {} }
并应被接受为两个字符串:
{ } and { }
{ {} {} {} {} {} {} } and { {} }
{{{{ }{{ }}{ }}}} and {{ }{ }{ }}
大括号的任何内部分组中都可以包含无限递归分组,如:
{{{{ }{{ }}{ }}}}{{ }{ }{ }}
并应被接受为两个字符串:
{ } and { }
{ {} {} {} {} {} {} } and { {} }
{{{{ }{{ }}{ }}}} and {{ }{ }{ }}
我自己考虑这个问题已经有相当长一段时间了,但没有找到合适的解决方案,而且我发现网上没有任何工具可以直观地看到这两个子字符串,它总是与整个字符串相匹配。我还使用了一些正则表达式的创建者,比如“”,并给了它最大数量的字符串和所有可能的边缘情况,等等,但只得到了大约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);
{},{}
{{}},{{}
{{{}{}{}{}{}}{}}{}},{}
{{{{{{{{{{}}{{{}}{{}}{{}}{{}}}{{}}}{{}},{{}}
{{{{}{{{{}}{{{{}}}{{{}}{{}}}{{{}}}{{{}}}{{{}}}{{{}}}{{{}}}{{{}}}}{{{}}}{{}}{{}}}{{}}{{}}}{{}}}}}{{{}}}}}}{{{}}}}}}{{{}}}}}}{{{}}}}}}}{{{}}}}}}}}}}{{{}}}}}}}}}}}}}}}}}{{{{}}}}}}}}}}}}}}}}}}
{{}},{{}{{}{}}
{{}{}}{{{}}{{{}}{{{}}}{{{{}}}}
正则表达式不适合此任务(至少JS风格不适合)。任何涉及可以任意嵌套的结构的东西都不适合与正则表达式匹配。这就是为什么他们说或JSON的原因。有关更多信息,请参见此
这里的字符串很容易解析,不用正则表达式。使用正则表达式会让你的生活变得很艰难
下面是如何解析这个字符串(假设括号总是平衡的):
- 在字符串中循环
- 如果遇到大括号,请将其添加到计数器变量
- 如果遇到右大括号,请减去一
- 计数器变量第一次达到0时,即第一个子字符串的末尾,其余的是第二个子字符串