javascript - 正则表达式匹配不包含此字符串的字符串之间的内容
问题描述
我需要匹配一个以特定字符串开头结尾的字符串,例如[#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。
解决方案
你可以使用这个正则表达式:
#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]);
推荐阅读
- bash - Bash 脚本 - 在 case 结构或 if else 语句中不执行读取命令
- html - 网站在 Chrome 移动调试版本上看起来很好,但在我的手机上看起来不同
- python - pandas 中列表和列表的梳理
- sql-server - 在分区方案上创建表与在分区方案上创建集群索引有什么区别
- assembly - 基于时间的流程管理是如何实现的
- azure-api-management - 如何使用 Azure API 管理为公共合作伙伴和我自己的应用程序发布端点集合
- flutter - Flutter 应用在 APK 文件中没有 Internet 权限
- node.js - 如何使用 Cheerio JS 打印属性的第三个实例
- javascript - jQuery:启动 OKZoom 的问题
- pyspark - Pyspark 滚动平均值从第一行开始