Как я уже упоминал в моем предыдущем комментарии, здесь вы имеете дело с двумя различными escape-последовательностями:
\n
- это escape-последовательность для символа новой строки, т.е. Unicode Character 'LINEFEED (LF) '(U + 000A) \\
является escape-последовательностью для обратной косой черты, т. Е. Unicode-символ' REVERSE SOLIDUS '(U + 005C)
Хотя эти escape-последовательности представляют собой два символа в исходном коде , они фактически представляют только один символ в памяти.
Замечание:
const toEscaped = s => s.toSource().match(/"(.*)"/)[0];
['\n', '\\n', '\\\n', '\\\\n', '\\\\\n']
.forEach(s => console.log(`There are ${s.length} character(s) in ${toEscaped(s)}`))
Это также относится к регулярным выражениям.\n
фактически считается одним символом, поэтому наблюдатель (?=.{2})
также попытается захватить предшествующий \
, поэтому вы, возможно, видите некоторую странность в том, как работает ваша замена.
Однако, основываясь на прочтении некоторых ваших комментариев, похоже, вы имеете дело с неправильными кодировками.Например, у вас могут быть случаи, когда пользователь вводит foo\nbar
в поле ввода, которое интерпретируется как литерал \
, за которым следует n
(то есть "foo\\nbar"
), и теперь вы хотите интерпретировать это как символ новой строкисимвол (т.е. "foo\nbar"
).В этом случае вы на самом деле не пытаетесь удалить \
символов, вы пытаетесь преобразовать последовательность символов \
+ n
в \n
.
В следующем фрагменте кода показано, каквыполнить замены escape-последовательности для \\
и \n
:
const toEscaped = s => s.toSource().match(/"(.*)"/)[0];
const toHex = s => Array.from(s).map((_, i) => s.charCodeAt(i).toString(16).padStart(2, '0')).join('+');
['\n', '\\n', '\\\n', '\\\\n', '\\\\\n']
.map(s => ({ a: s, b: s.replace(/\\n/g, '\n').replace(/\\\\/g, '\\') }))
.forEach(({a, b}) => console.log(`${toEscaped(a)} --> ${toHex(b)}`))
И на оба замените "\\n"
на "\n"
и удалите "\\"
предшествующих ему символов, попробуйте что-то вроде этого:
const toEscaped = s => s.toSource().match(/"(.*)"/)[0];
const toHex = s => Array.from(s).map((_, i) => s.charCodeAt(i).toString(16).padStart(2, '0')).join('+');
['\n', '\\n', '\\\n', '\\\\n', '\\\\\n']
.map(s => ({ a: s, b: s.replace(/\\+[n\n]/g, '\n') }))
.forEach(({a, b}) => console.log(`${toEscaped(a)} --> ${toHex(b)}`))