Javascript 用regex nodejs替换可变字符串
我需要在一个非常大的字符串中识别类似于以下内容的模式,并将其替换为“null”:Javascript 用regex nodejs替换可变字符串,javascript,node.js,regex,Javascript,Node.js,Regex,我需要在一个非常大的字符串中识别类似于以下内容的模式,并将其替换为“null”: [“pmeta”、[“ImageSelectStoreFront”、null、3、4、2、null、“Storefront”、[]], [“pmeta”、[“/m/01pns0”、空、3、3、空、“消防栓”、[]、空、[1], [“pmeta”、[“/m/0199g”、空、3、3、空、“bicycle”、[]、空、[1]、 这些字符串似乎是JSON,但它们出现的字符串不是JSON,因此解析它毫无意义。我也不需要解析
[“pmeta”、[“ImageSelectStoreFront”、null、3、4、2、null、“Storefront”、[]],
[“pmeta”、[“/m/01pns0”、空、3、3、空、“消防栓”、[]、空、[1],
[“pmeta”、[“/m/0199g”、空、3、3、空、“bicycle”、[]、空、[1]、
这些字符串似乎是JSON,但它们出现的字符串不是JSON,因此解析它毫无意义。我也不需要解析这个JSON,我需要从它出现的字符串中删除它
唯一总是相同的部分是
[“pmeta”,
最后是结束括号和逗号
我正在探索正则表达式作为一种可能的解决方案,但我对它完全陌生,还没有找到任何有用的方法
有人能给我一些正则表达式指针或建议其他方法来实现这一点吗?假设一个字符串中只有一个模式出现,并且没有任何其他出现的
],
那么\[“pmeta”,..\],
就可以工作了。正则表达式演示:
JavaScript实现:
inputstr='djfhjkdfhkhdhdf[“pmeta”,“ImageSelectStoreFront”,null,3,4,2,null,“Storefront”,“[]],jdkfhkjdhf';
pattern=newregexp('\\[“pmeta”,.\\],',“gm”);
console.log(输入str.replace(模式“”)代码>您可以执行自定义解析,而不是正则表达式。其工作方式如下:
查找输入中是否有以[“pmeta”
开头的内容
将其计算为startIndex
通过保留一堆括号来查找索引后最后一个结束括号的索引。为每个打开的括号向堆栈中添加一个元素,为任何结束括号删除一个项目。清空堆栈时,这就是最后一个结束括号。将其计为endIndex
从startIndex
到endIndex
查找字符串的部分,然后将其替换为null
我已通过将长值替换为单个单词来缩短(并匿名)您的样本:
let input=`]}
[“rresp”,
“一个”,
无效的
120,
[“pmeta”,[“/m/01pns0”,空,3,3,3,空,“消防栓”,[]
]
,null,[1]
]
,“动态”,空,[“bgdata”,“2”,“3”]
“四”、“五”]`
让输出=清洁(输入);
console.log(“输出”,output);
函数清除(文本){
让startIndex=text.indexOf('[“pmeta”);
//没有要删除的内容-提前退出
if(startIndex==-1)返回文本;
让endIndex=findLastopen括号(文本,startIndex);
让toReplace=text.substring(startIndex,endIndex);
log(“找到要替换的文本:”,toReplace);
返回文本。替换(替换为“null”)
}
函数findLastopen括号(文本,起始索引){
让open方括号=[];
for(设i=startIndex;i }
解析JSON标题不清楚您想要什么replace@CertainPerformance这实际上对我没有用处。这个JSON显示在一个字符串中,我需要去掉它,而不是解析它。解析JSON->filter->serialise to JSON,这应该会容易得多。编写和维护正则表达式会非常烦人。自定义解析器比较起来会更容易,但比一个简单的解析->过滤->序列化工作要多得多。@Joxrox请在您的问题中添加该细节;评论是临时的,旨在寻求澄清。这与发布在comments@Joxrox但是@VLAZ是真的。我在发布之前没有看到这个粘贴箱。就像我提到的,这个只有在没有出现其他],
的情况下,正则表达式才有效吗。我也没有想到这个模式可能包含新的行(<代码> 标志将处理它)。非常感谢你的帮助,我将在明天研究这个解决方案-在这里很晚:)一些后来的想法-我刚刚意识到,保持一个堆栈的括号是一个多余的在这里。您可以使用一个计数器open括号=0
执行此操作,并为每个打开的括号递增,为每个关闭的括号递减。我想这会更好,但是,正如我所说的,这个功能还有很多可以改进的地方。它可以推广到任何类型的括号和/或引号。不过,我会保持原样。