繁体   English   中英

PHP正则表达式:如何匹配\\ r和\\ n而不使用[\\ r \\ n]?

[英]PHP Regex: How to match \r and \n without using [\r\n]?

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

$string = "
Test
";

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

更清楚的是,我的问题是,是否还有其他选择匹配\\r\\n

PCRE和换行符

PCRE具有多种与换行有关的转义序列和替代方案。

好吧,你可以在这里使用的一个漂亮的转义序列是\\R 默认情况下\\R将匹配Unicode换行符序列,但可以使用不同的替代方案进行配置。

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

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

这相当于以下组:

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

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

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

uunicode )修饰符打开PCRE的附加功能,Pattern字符串被视为( UTF-8 )。

相当于以下组:

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

可以限制\\R仅匹配CRLFCRLF

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”。

这并没有回答替代方案的问题,因为\\v非常有效

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

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

  • "#\\\\v+#"逃脱了反斜杠

要么

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

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

更新:

perlrebackslash开始 ,只需将\\v的范围与\\R相比清楚

  • \\ r
    \\R匹配通用换行符; 也就是说,任何被Unicode视为换行序列的东西。 这包括\\v (垂直空白) 匹配的所有字符 ,......

如果有一些奇怪的要求阻止您在模式中使用文字[\\r\\n] ,则可以始终使用十六进制转义序列:

preg_match('#[\xD\xA]+#', $string)

这种模式相当于[\\r\\n]+

要匹配给定String的每个LINE,只需使用^$ Anchors并建议您的正则表达式引擎在多行模式下运行。 然后^$将匹配每一行的开始和结束,而不是整个字符串的开始和结束。

http://php.net/manual/en/reference.pcre.pattern.modifiers.php

在PHP中,这将是模式之后的m修饰符。 /^(.*?)$/m将简单匹配每一行,由给定字符串内的任何垂直空格分隔。

顺便说一下:对于line-Splitting,你也可以使用split()PHP_EOL常量:

$lines = explode(PHP_EOL, $string);

问题是您需要多行选项,或者如果使用点,则需要dotall选项。 它在分隔符的末尾。

http://www.php.net/manual/en/regexp.reference.internal-options.php

$string = "
Test
";
if(preg_match("#\v+#m", $string ))
echo "Matched";
else
echo "Not Matched";

要匹配PHP中的换行符,请使用php常量PHP_EOL 这是跨平台。

if (preg_match('/\v+' . PHP_EOL ."/", $text, $matches ))
   print_R($matches );

此正则表达式还匹配换行符\\n和回车符\\r \\n字符。

(?![ \t\f])\s

DEMO

要匹配一个或多个换行符或回车符,可以使用以下正则表达式。

(?:(?![ \t\f])\s)+

DEMO

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM