只有当它们后面没有跟 n 时,如何替换所有出现的 \?

How to replace all occurrences of \ only if they are not followed by n?

似乎是一项相对简单的任务,让我陷入了一个 PHP 应用程序。我有一个字符串,里面有一堆 \n 。那些很好,需要留在那里。但是,也有字符 \ 和我需要替换或删除的字符的单次出现,我们只说空字符而不删除后面跟 n.

的字符

我想出的最好办法是先将所有 \n 替换为其他东西,一些奇怪的字符,然后将剩余的 \ 替换为空的 space,然后再转换回\n 的奇怪字符。然而,这似乎是在浪费时间和资源,此外,没有什么能保证我会找到足够奇怪的字符,而这些字符在字符串的其余部分中永远不会遇到...

有什么建议吗?

你应该能够用否定的先行断言来做到这一点:

\(?!n)

\寻找反斜杠,(?!n)断言下一个字符不是n,但不匹配字符。

要在 PHP 中使用它:

$text = 'foo\nbar\nb\az\n';
$newtext = preg_replace('/\\(?!n)/', '', $text);

详情在这里:https://regex101.com/r/F2qhAP/1

你需要

$s = preg_replace('~\\(?!n)~', '', $s);

参见PHP demo

$s = '\n \t \';
$s = preg_replace('~\\(?!n)~', '', $s);
echo $s; // => \n t 

我们需要 4 个反斜杠将 2 个文字反斜杠传递给正则表达式引擎以匹配输入字符串中的 1 个文字反斜杠。 (?!n) 是一个 负先行 ,它使反斜杠的所有匹配都失败,反斜杠紧随其后 n.