【问题标题】:Remove all debuggers that ARE NOT between single or double quotes删除所有不在单引号或双引号之间的调试器
【发布时间】:2019-07-15 19:28:59
【问题描述】:

我正在尝试实现一个正则表达式,该表达式从文件中删除所有调试器,除非该调试器位于...

  1. 单引号
  2. 双引号

我有以下适用于双引号的代码,但我不确定如何包含单引号。

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 都应保留。

【问题讨论】:

  • 不是答案,但为什么debugger+?这将删除debuggerrrrrrr,我认为这不是你想要的。此外,“任何不在双引号或单引号内的debugger 都应单独保留。”应该读作“......应该被删除”。对?你想留下那些引号的。
  • 这不是正则表达式的任务。至少,不是这样。
  • @apsillers 感谢您指出这些。 + 在他们之前的尝试中被错误地留下了。我还编辑了最后一行。

标签: javascript regex regex-lookarounds


【解决方案1】:

当您在所有上下文中删除一个字符串但在单引号或双引号内时,更容易匹配引号并将它们捕获到一个组中,以便稍后在替换模式中对该组进行反向引用来恢复结果字符串:

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

【讨论】:

  • 关于最后一个模式:[^\/] 可能是[^\\],并且不确定在带引号的子字符串之外寻找 "escaped" 引号是否有意义。
猜你喜欢
  • 2021-07-03
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 2019-08-11
  • 1970-01-01
  • 2013-06-22
相关资源
最近更新 更多