Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 查找与给定字符串中的两个子字符串匹配的正则表达式_Javascript_Regex_Regular Language - Fatal编程技术网

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

Javascript 查找与给定字符串中的两个子字符串匹配的正则表达式,javascript,regex,regular-language,Javascript,Regex,Regular Language,我试图创建一个正则表达式,它将显示给定字符串中的两个子字符串,返回值应该是一个包含两个元素的数组,两个匹配的字符串。我知道我的问题与回文的问题密切相关,回文的问题不能作为正则表达式实现,但我希望正则表达式能够足够接近,因为我希望能够阅读有限大小的结构 非常具体地说,我只关心匹配两个顶级子级,就像第一个示例中一样,内部任何数量的嵌套括号都无关紧要,不管它们是1个还是99999个 请注意,间距只是为了更易于阅读,输入字符串将没有空格。这种结构很简单: { }{ } 并应被接受为两个字符串: { }

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

非常具体地说,我只关心匹配两个顶级子级,就像第一个示例中一样,内部任何数量的嵌套括号都无关紧要,不管它们是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时,即第一个子字符串的末尾,其余的是第二个子字符串

使用JS的原生正则表达式是不可能的。虽然工具可能存在,但您可能会发现使用非正则表达式解决方案更容易。您试图做的并不是正则表达式要做的。您需要的是一个可解析的副本,它之所以不是副本,是因为我只关心匹配两个顶级括号,而不关心其他数量嵌套将以任何方式改变匹配。这就是为什么我的示例正则表达式包括“*”,因为初始括号内的内容没有意义。但这仍然需要正则表达式引擎记住它当前的嵌套级别,这是正则表达式所不能做到的。我已经在使用这个精确的实现,同时我发现了正则表达式(如果有的话)。@Avionix你为什么如此关注正则表达式?正则表达式的效率会低很多cient.我觉得正则表达式可以加速这样的过程。我知道只需遍历字符串就是O(n)时间。@Avionix如果你阅读第二个链接的第二段,你会发现正则表达式要慢得多。嵌套的大括号很重要,即使你认为它们不重要。你需要它们知道你目前处于哪一个嵌套级别。好的,我将接受这个答案,因为它已经是我实现的。谢谢。