首页 > 解决方案 > 正则表达式匹配不包含此字符串的字符串之间的内容

问题描述

我需要匹配一个以特定字符串开头结尾的字符串,例如[#start,and ,#end]。我为此使用正则表达式/\[#start,(.*?),#end\]/g

const string = '[#start,foobar,#end]'
const regex = /\[#start,(.*?),#end\]/g

console.log(string.match(regex))

下一步是在中间添加匹配不包含另一个匹配的条件,例如[#start,[#start,foobar,#end],#end]。我为此使用了负面的环顾四周/\[#start,((?!\[#start,(.*?),#end\]).*?),#end\]/g

const string = '[#start,[#start,foobar,#end],#end]'
const regex = /\[#start,((?!\[#start,(.*?),#end\]).*?),#end\]/g

console.log(string.match(regex)) // --> will just match "[#start,foobar,#end]"

到目前为止它运行良好,但问题是起始字符串有点复杂,因为它匹配类似/"#for (.*?) in (.*?)",/g. 例子:

const string = '"#for i in [1, 2]",{"id": "[i]"},"#endfor"'
const regex = /"#for (.*?) in (.*?)",(.*?),"#endfor"/g

console.log([...string.matchAll(regex)])

同样,我不希望“中间”包含这种语法,所以我像前面的例子一样使用否定的环视"#for (.*?) in (.*?)",(((?!"#for (.*?) in (.*?)",(.*?),"#endfor").)*?),"#endfor"

const string = '"#for i in [1, 2]","#for i in [1, 2]",{"id": "[i]"},"#endfor","#endfor"'
const regex = /"#for (.*?) in (.*?)",(((?!"#for (.*?) in (.*?)",(.*?),"#endfor").)*?),"#endfor"/g

console.log(string.match(regex))

但在这种情况下,它仍然匹配第一次出现的 ,#for i in [1, 2]而不仅仅是中间的字符串"#for i in [1, 2]",{"id": "[i]"},"#endfor"。知道发生了什么吗?

对于那些想知道为什么要使用这样的正则表达式的人,我需要在项目的开发中使用它restapify使您能够轻松地模拟具有 JSON 文件结构的 rest API。

标签: javascriptregex

解决方案


你可以使用这个正则表达式:

#for ((?:(?!#for .*? in .*?",|"#endfor).)*?) in ((?:(?!#for .*? in .*?",|"#endfor).)*?)",((?:(?!#for .*? in .*?",|"#endfor).)*?),"#endfor

正则表达式演示

代码:

const string = '"#for i in [1, 2]","#for i in [1, 2]",{"id": "[i]"},"#endfor","#endfor"';

const regex = /#for ((?:(?!#for .*? in .*?",|"#endfor).)*?) in ((?:(?!#for .*? in .*?",|"#endfor).)*?)",((?:(?!#for .*? in .*?",|"#endfor).)*?),"#endfor/g;

var m = [...string.matchAll(regex)]

if (m)
  console.log(m[0]);


推荐阅读