PHP 正则表达式:如何在不使用 [\r\n] 的情况下匹配 \r 和 \n?

2022-08-30 21:33:13

我已经测试了(垂直空白)的匹配及其组合,但我发现不匹配和.以下是我正在使用的代码。\v\r\n\v\r\n

$string = "
Test
";

if (preg_match("#\v+#", $string )) {
  echo "Matched";
} else {
  echo "Not Matched";
}

更清楚的是,我的问题是,有没有其他选择可以匹配?\r\n


答案 1

PCRE 和换行符

PCRE 具有与换行符相关的转义序列和替代项的多余性。

好吧,您可以在此处使用的漂亮的转义序列是 。默认情况下,它将匹配 Unicode 换行符序列,但可以使用不同的替代项进行配置。\R\R

匹配范围内的任何 Unicode 换行符序列。ASCII

preg_match('~\R~', $string);

这等效于以下组:

(?>\r\n|\n|\r|\f|\x0b|\x85)

匹配任何 Unicode 换行符序列;包括范围外的换行符以及行分隔符 () 和段落分隔符 (),您希望打开 (unicode) 标志。ASCIIU+2028U+2029u

preg_match('~\R~u', $string);

unicode) 修饰符打开 PCRE 的附加功能,模式字符串被视为 (UTF-8)。u

等效于以下组:

(?>\r\n|\n|\r|\f|\x0b|\x85|\x{2028}|\x{2029})

可以限制为匹配 、 或 仅匹配:\RCRLFCRLF

preg_match('~(*BSR_ANYCRLF)\R~', $string);

等效于以下组:

(?>\r\n|\n|\r)

附加

支持五种不同的约定来指示字符串中的换行符:

(*CR)        carriage return
(*LF)        linefeed
(*CRLF)      carriage return, followed by linefeed
(*ANYCRLF)   any of the three above
(*ANY)       all Unicode newline sequences

注意:字符类内部没有特殊含义。与其他无法识别的转义序列一样,默认情况下,它被视为文字字符“R”。\R


答案 2

这并不能回答替代方案的问题,因为 \v 运行良好

\v匹配任何被视为垂直空格的字符;这包括平台的回车符和换行符(换行符)以及其他几个字符,所有这些都在下表中列出。

您只需更改为"#\v+#"

  • "#\\v+#"转义反斜杠

  • '#\v+#'使用单引号

在这两种情况下,您都将获得 和 的任意组合的匹配项。\r\n

更新:

只是为了使范围清楚比较,从perlrebackslash\v\R

  • \R
    匹配一个泛型换行符;也就是说,Unicode 认为是换行序列的任何内容。这包括与 \v(垂直空格)匹配的所有字符,...\R

推荐