我正在尝试实现一个正则表达式,该表达式将从文件中删除所有调试器,除非该调试器位于...
我有以下代码适用于双引号,但我不确定如何也包括单引号。
var removeDebuggers = (str) => {
str = str.replace(/debugger(?=([^"]*"[^"]*")*[^"]*$)/g, "");
console.log(str)
}
removeDebuggers(`
Here is a 'debugger' in single quotes.
- DOESN'T WORK.
Another "debugger test" but with double quotes.
- WORKS.
"Testing this debugger also."
- WORKS.
My final debugger not in quotes.
- WORKS.
`)
我要处理的结果是“ Here is a 'debugger' in single quotes.
”中的调试器也没有被删除。不在双引号或单引号内的任何debugger
都应该保留。
答案 0 :(得分:2)
在所有上下文中但在单引号或双引号中删除字符串时,更容易匹配引号并将其捕获到组中,以便以后在替换模式中对该组进行反向引用时将其还原为结果字符串:< / p>
str = str.replace(/("[^"]*"|'[^']*')|debugger/g, "$1");
请参见regex demo。
详细信息
("[^"]*"|'[^']*')
-第1组(替换模式中用$1
指代):
"[^"]*"
-"
,除"
以外的0个或更多字符,然后为"
|
-或'[^']*'
-'
,除'
以外的0个或更多字符,然后为'
|
-或debugger
-子字符串。要将debugger
整体匹配,请使用单词边界\bdebugger\b
。
为支持单引号/双引号内的转义序列,将("[^"]*"|'[^']*')
模式扩展为("[^"\\]*(?:\\[\s\S][^"\\]*)*"|'[^'\\]*(?:\\[\s\S][^'\\]*)*')
。或者,更好的是((?:^|[^\/])(?:\\{2})*"[^"\\]*(?:\\[\s\S][^"\\]*)*"|'[^'\\]*(?:\\[\s\S][^'\\]*)*')
。
因此,增强版看起来像
str = str.replace(/((?:^|[^\/])(?:\\{2})*"[^"\\]*(?:\\[\s\S][^"\\]*)*"|'[^'\\]*(?:\\[\s\S][^'\\]*)*')|\bdebugger\b/g, '$1');
请参见this regex demo。