Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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中匹配平衡delimeter之间内容的正则表达式_Javascript_Regex - Fatal编程技术网

在JavaScript中匹配平衡delimeter之间内容的正则表达式

在JavaScript中匹配平衡delimeter之间内容的正则表达式,javascript,regex,Javascript,Regex,鉴于这些例子: {{foo}} {foo{bar}} {bar} baz {quz {foobar}} 预期产出将是: foo foo{bar} bar baz {quz foobar} 也就是说,在可能包含最多一个匹配项的任意文本中搜索,并使用正则表达式和字符串替换方法替换平衡的delimeter({}) someStr.replace(/regexp goes here/, match => return match); 我知道方括号对的模式({})/{(.*?}/,({{{

鉴于这些例子:

{{foo}}
{foo{bar}}
{bar}
baz

{quz
{foobar}}
预期产出将是:

foo
foo{bar}
bar
baz

{quz
foobar}
也就是说,在可能包含最多一个匹配项的任意文本中搜索,并使用正则表达式和字符串
替换
方法替换平衡的delimeter(
{}

someStr.replace(/regexp goes here/, match => return match);
我知道方括号对的模式(
{}
/{(.*?}/
,(
{{{}}
/{(.*?}}/
),但不知道如何将方括号的0、1和2引用组合成一个正则表达式


此外,为了只匹配没有delimeter的内容,我们应该使用lookaround断言

如果所有这些事件都发生在一个大文本中,那么即使使用更具特色的regex风格,也很难找到有效的答案,但是如果它们是分离的输入字符串,您可能有一个解决方案。计算输入字符串开头的大括号数,并删除该数字结尾处的右大括号:

var inputStrings=[
“{{foo}}}”,
“{bar}”,
"baz",,
“{quz”,
“{foobar}}”,
“{foo{bar}}”
];
inputStrings.forEach(函数(值){
var numberOfBracesAtStart=(value.match(/{/gy)| |[]).length;;
console.log(value.replace(新的RegExp(“^\{{”+numberOfBracesAtStart+“}(.*)\}{”+numberOfBracesAtStart+“}$”,$1”);

})
如果所有这些事件都出现在一个大文本中,即使使用更具特色的正则表达式风格,也很难找到有效答案,但如果它们是分开的输入字符串,您可能会有一个解决方案。计算输入字符串开头大括号的数量,并在结尾删除该数字中的结束大括号:

var inputStrings=[
“{{foo}}}”,
“{bar}”,
"baz",,
“{quz”,
“{foobar}}”,
“{foo{bar}}”
];
inputStrings.forEach(函数(值){
var numberOfBracesAtStart=(value.match(/{/gy)| |[]).length;;
console.log(value.replace(新的RegExp(“^\{{”+numberOfBracesAtStart+“}(.*)\}{”+numberOfBracesAtStart+“}$”,$1”);

})
如果目标真的只是从这些行中删除相同数量的开头和结尾分隔符,那么您也可以使用一个简单的循环来“计数”第一个和最后一个字符分别匹配{和}的时间,然后简单地返回适当长度的子字符串:

var-inputStrings='{{foo}},{foo{bar},{bar},baz,{quz,{foobar}'。拆分(',');
inputStrings.forEach(函数(值){
var c=0,l=value.length-1;
同时(值[C]===‘{’& &值[L C]===}’){C++;}
console.log(值“->”,值.substring(c,l-c+1));

})
如果目标真的只是从这些行中删除相同数量的开头和结尾分隔符,那么您也可以使用一个简单的循环来“计数”第一个和最后一个字符分别匹配{和}的时间,然后简单地返回适当长度的子字符串:

var-inputStrings='{{foo}},{foo{bar},{bar},baz,{quz,{foobar}'。拆分(',');
inputStrings.forEach(函数(值){
var c=0,l=value.length-1;
同时(值[C]===‘{’& &值[L C]===}’){C++;}
console.log(值“->”,值.substring(c,l-c+1));

})
递归使事情变得更加简单和简短:

var trim=s=>/^{.*}$/.test(s)?trim(s.slice(1,-1)):s;
变量a='{{foo}}{foo{bar}{bar}baz{quz{foobar}}'。拆分('');

console.log(a.map(trim).join('\n'));
递归使事情变得更加简单和简短:

var trim=s=>/^{.*}$/.test(s)?trim(s.slice(1,-1)):s;
变量a='{{foo}}{foo{bar}{bar}baz{quz{foobar}}'。拆分('');
console.log(a.map(trim).join('\n'));
试试这个:

var arr=[“{{foo}}”、“{foo{bar}”、“baz”、“{quz”、“{foobar}}”];
var regx=/^{([^{}]+)}}{{{(.*)}}$/g;
var-res=[];
对于(变量i=0;i
尝试以下操作:

var arr=[“{{foo}}”、“{foo{bar}”、“baz”、“{quz”、“{foobar}}”];
var regx=/^{([^{}]+)}}{{{(.*)}}$/g;
var-res=[];
对于(变量i=0;iconsole.log(res);
为什么不
foobar}
?大括号之间是否可能有其他字符,例如
{a{b}
?最后一个问题,它们是单个输入字符串还是全部在一个大文本中?编写一个解析器,而不是正则表达式。您的输入/输出示例仍然不一致(或者问题规范仍然很模糊)-如果
{foo{bar}
导致
foo{bar}
,那么
{foobar}}
应该是
foobar}
,否?或者,即使嵌套在多个“级别”上,它也应该检查整个字符串中是否有匹配数量的分隔符。。。?对于一个简单的正则表达式替换来说太复杂了。为什么不在大括号之间插入其他字符,例如,
{a{b}
?最后一个问题,它们是单个输入字符串还是全部在一个大文本中?编写一个解析器,而不是正则表达式。您的输入/输出示例仍然不一致(或者问题规范仍然很模糊)-如果
{foo{bar}}
导致
foo{bar}
,那么
{foobar}}
应该是
foobar}
,否?或者它应该检查整个字符串是否匹配分隔符的数量,即使嵌套在多个“级别”上,还有…?对于一个简单的正则表达式替换来说,变得太复杂了。我认为这也解决了问题。这也给了我递归的线索。我认为这解决了问题。这也给了我递归的线索。