匹配字符但不在前面

时间:2014-03-25 12:02:56

标签: javascript regex regex-negation

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

/[^\{\]]\n/g

我做错了什么?

4 个答案:

答案 0 :(得分:1)

当您使用[^\{\]]时,您使用了字符范围:这代表"任何不是\{\]的字符。这意味着匹配将在{\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

答案 1 :(得分:1)

您是否需要删除\n\r\n或两者兼而有之?

这应该做的工作:

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

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

要回答有关/[^\{\]]\n/错误原因的问题,此正则表达式等同于:"匹配任何既不是{也不是]"的字符,后跟\n,因此错误地无法匹配以下内容:

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

你最后还错过了g标志,但你可能已经注意到了。

答案 2 :(得分:0)

不支持看后面,你可以这样模仿它

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

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

答案 3 :(得分:0)

我的解决方案是:

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

您的替换字符串应为$1<replacement>

由于JavaScript不支持lookbehind,我们必须使用lookahead。这就是正则表达式的工作原理:

  • {之外的任何内容,然后是任何内容 - [^{].
  • 除了] - .[^\]]
  • 之外的任何事情
  • 简单地说,[^{].|.[^\]]匹配..匹配的所有内容,{]
  • 除外
  • 最后一个\n

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