1

目标是将字符串拆分为行,除非前面有反斜杠。让我们想象一下。像这样的字符串:

Hello\
 world!
Bye, world.

应该分开:

[0] Hello world!
[1] Bye, world!

我想出了这个正则表达式(对于 PHP,preg_split):

/(?<!\\\\)\n/

它拆分并在拆分时考虑反斜杠,但是:

  • 反斜杠和换行符仍然存在。
  • 它仅适用于类 UNIX 换行符 ( \n)。

所以,它实际上输出:

[0] Hello\\x10 world!
[1] Bye, world!

我的正则表达式应该如何?

到目前为止,为了解决这些问题,我已经尝试过:

/(?<!\\\\)(?:\r\n|\n|\r)/
/(?:(?<!\\\\)\n)/

但他们都没有工作。

4

2 回答 2

3

您需要分两步完成:

  1. 加入行
  2. 然后分裂
$text = preg_replace('/(?<!\\\\)((?:\\\\\\\\)*)\\\\((?:\n|\r)+)/', "$1", $text);
$result = preg_split('/(\r|\n)+/', $text);

第一个正则表达式确保它仅在换行符之前有奇数个斜杠时才拆分,因此保留了“转义斜杠”。

因此,您可能会考虑在最后用真实的反斜杠替换转义的反斜杠:

$text = preg_replace('/(?<!\\\\)((?:\\\\\\\\)*)\\\\((?:\n|\r)+)/', "$1", $text);
$text = preg_replace('/\\\\\\\\(?=(\\\\\\\\)*$)/m', '\\', $text);
$result = preg_split('/\r\n?|\n/', $text);
于 2012-11-25T10:31:07.373 回答
2

你第一次尝试解决这个问题已经很好了。但是您不会使用与拆分相同的正则表达式来消除换行符。您可以preg_replace先在输入中使用它(以消除转义的换行符):

$str = preg_replace('/\\\\(?:\r\n?|\n)/', '', $str);

然后做一个简单preg_split的:

$result = preg_split('/\r\n?|\n/', $str);

注意:您可能希望对反斜杠的位置更加宽容,以便忽略行尾的尾随空格。这将使初始替换看起来像这样:

$str = preg_replace('/\\\\[ \t]*(?:\r\n?|\n)/', '', $str);

现在,一行末尾的意外制表符或空格(在反斜杠之后)不会破坏转义。

于 2012-11-25T10:30:06.873 回答