【问题标题】:How to escape newlines with "\" using RegEx如何使用 RegEx 使用“\”转义换行符
【发布时间】:2012-11-25 10:25:30
【问题描述】:

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

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)/

但它们都不起作用。

【问题讨论】:

    标签: php regex


    【解决方案1】:

    您需要分两步完成:

    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);
    

    【讨论】:

    • 我认为即使使用'',您也需要\\\\ 作为一个反斜杠。在替换字符串中,您可以使用$1
    • @m.buettner 看起来是这样。 PHP 刚刚向我抱怨:P
    • preg_replace():编译失败:lookbehind assertion 在偏移量 27 处不是固定长度
    【解决方案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);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-27
      • 2018-07-23
      相关资源
      最近更新 更多