匹配字符,但前面没有

Match character but not when preceded by

本文关键字:前面 字符      更新时间:2023-09-26

我想替换所有的换行符,但只有当它们之前没有这两个字符{](两个,而不是其中一个)使用JavaScript。下面的表达式似乎完成了这项工作,但它破坏了其他正则表达式的结果,所以一定是出错了:

/[^'{']]'n/g

我做错了什么?

您是否需要能够剥离'n, 'r'n或两者?

这应该可以完成工作:

/(^|^.|[^{].|.[^']])'r?'n/gm

并且要求您将$1放在替换字符串的开头。

为了回答你关于为什么/[^'{']]'n/是错误的问题,这个正则表达式等于:"匹配任何既不是{也不是]的字符",后面跟着'n,所以这错误地无法匹配以下内容:

here's a square]'n
see the following{'n

您还缺少结尾的g标志,但您可能已经注意到。

当你使用[^'{']]时,你正在使用一个字符范围:这代表"任何不是'{']的字符"。这意味着匹配将在{'n}'n上失败。

如果你想否定一个超过一个字符的模式,你需要一个否定的前瞻性:

/^(?!.*{]'n)([^'n]*)'n/mg
^(?!          # from the beginning of the line (thanks to the m flag)
    .*{]'n    # negative lookahead condition: the line doesn't end with {]'n
)
([^'n]*)      # select, in capturing group 1, everything up to the line break
'n

代替
$1 + replacement_for_'n

我们所做的是逐行检查我们的行是否包含不需要的模式。

如果没有,我们在捕获第1组中选择直到结尾'n的所有内容,然后用所有内容替换整行,然后用您想要替换'n的内容。

演示:http://regex101.com/r/nM2xE1

不支持向后看,您可以这样模拟

stringWhereToReplaceNewlines.replace(/(.{0,2})'n/g, function(_, behind) {
  return (behind || "") + ((behind === '{]') ? "'n" : "NEWLINE_REPLACE")
})

对于前面两个字符作为第二个参数的每个"'n"调用回调。回调必须返回替换"'n"和之前的2个字符的字符串。如果前两个字符是"{]"那么新行不应该被替换所以我们返回匹配的完全相同的字符串,否则我们返回前两个字符(可能是空的)以及应该替换换行符

的内容

我的解决方案是:

([^{].|.[^']])'n

你的替换字符串应该是$1<replacement>

由于JavaScript不支持向后看,我们必须使用向前看。以下是正则表达式的工作方式:

  • 除了{,然后是[^{].
  • ] - .[^']]
  • 简单地说,[^{].|.[^']]匹配..匹配的所有内容,除了{]
  • 最后一个'n

捕获'n之前的两个字符,因此可以使用$1将它们重新插入到替换字符串中。