我想替换所有换行符,但前提是它们前面没有使用JavaScript的这两个字符{]
(两者都不是其中之一)。以下表达式似乎可以完成这项工作,但它打破了其他正则表达式的结果,因此必定是错误的:
/[^\{\]]\n/g
我做错了什么?
答案 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
用。
答案 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
将它们重新插入替换字符串。