Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.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 - Fatal编程技术网

Javascript 使用正则表达式替换不同的字符

Javascript 使用正则表达式替换不同的字符,javascript,Javascript,我想删除字符串中一行的所有单个注释/和块注释/***/。 但是,如果这些注释位于字符'、'、[]和/或`内,则不应将其删除 示例: ='a' & '//b/*aasdsa //dsfds*/'& //comment '//d' /*aasdsa //dsfds*/ & '//e' & /*aasdsa //dsfds*/ & 'c' [// /* [] */] & h `// /* [] */` & p 应该是: ='a' &

我想删除字符串中一行的所有单个注释
/
和块注释
/***/
。 但是,如果这些注释位于字符
'
'
[]
和/或
`
内,则不应将其删除

示例:

='a' &
'//b/*aasdsa //dsfds*/'& //comment
'//d' /*aasdsa //dsfds*/ & '//e' & /*aasdsa //dsfds*/ 
& 'c'
[// /* [] */] & h
`// /* [] */` & p
应该是:

='a' &
'//b'& 
'//d'  & '//e' &  
& 'c'
 & h
 & p
我尝试过不同的解决方案,但我没有走得太远

let text = "='a' &
'//b'& //comment expression 
'//d' /*aasdsa //dsfds*/ & '//e' & /*aasdsa //dsfds*/ 
& 'c'";
let arrayText = text.split('\n');
arrayText = arrayText.filter(a => a.indexOf('//') !== 0);
arrayContent = arrayContent.map(x =>
x.replace(/[^\(?<=\').*(?=\'$)|\(?<=\[).*(?=\]$](\/\*[\s\S]*?\*\/|\/\/.*)/gm, ''));
text = arrayContent.join(' ');
我的解决方案的结果(不起作用)

预期结果:

='a' &
'//b/*aasdsa //dsfds*/'& 
'//d'  & '//e' &  
& 'c'
[// /* [] */] & h
`// /* [] */` & p

如果有人能告诉我我遗漏了什么或任何其他提示,我将不胜感激。

如评论中所述,正则表达式对于通常由标记化者完成的事情来说不是一个合适的工具。对于这个特定的用例,您可以编写一个简单的基于规则的解析器,如下所示:

const规则=[
{start:'[',end:']',remove:false},
{开始:“”,结束:“”,删除:false},
{开始:“”,结束:“”,删除:false},
{start:'`',end:'`',remove:false},
{start:'/',end:{EOL:true},remove:true},
{start:'/*',end:'*/',remove:true},
];
函数删除元素(str){
让start=-1,rule=null;
//逐字符迭代输入
对于(设i=0;i str.slice(i).startsWith(r.start));
如果(测试){
规则=测试;
开始=i;
}
}否则{
//当前位于字符串或注释中,请检查是否已结束
设end=-1;
if(str.slice(i).startsWith(rule.end)){
end=i+rule.end.length;
}else if(rule.end.EOL&(str.slice(i).startsWith('\n')| | str.slice(i).startsWith('\r\n')| | i==str.length-1)){
//行注释的特殊处理,可在多种情况下结束
结束=i+1;
}
如果(结束>-1){
如果(删除规则){
//如果是注释规则,则修改str-删除注释
str=str.slice(0,开始)+str.slice(结束);
i-=结束-开始;
}
规则=null;
}
}
}
返回str;
}
[“='a'&”,
“//b/*aasdsa//dsfds*/'&//comment”,
“//d'/*aasdsa//dsfds*/&//e'&/*aasdsa//dsfds*/”,
"&"c",,
“[//*[]*/]&h”,

“`//*[]*/`&p”].forEach(str=>console.log(removeComments(str))
您的第二个示例输入在被删除的
'//b'
字符串中包含一个块注释。这是故意的吗?IMO正则表达式不是合适的工具。我会考虑使用一个标记器/解析器。您拥有的正则表达式已经非常复杂且难以理解,我完全希望您会不断遇到破坏正则表达式的输入。请查看正则表达式可以得到多复杂的示例。@Joe我的解决方案已经做到了这一点。我不明白还需要添加哪些其他要求?
='a' &
'//b'&
'//d' & '//e' & 
& 'c'
[//]
='a' &
'//b/*aasdsa //dsfds*/'& 
'//d'  & '//e' &  
& 'c'
[// /* [] */] & h
`// /* [] */` & p