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

Jas*_*OOO 15 php regex pcre newline

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

$string = "
Test
";

if (preg_match("#\v+#", $string )) {
  echo "Matched";
} else {
  echo "Not Matched";
}
Run Code Online (Sandbox Code Playgroud)

更清楚的是,我的问题是,是否有其他替代品可供选择\r\n

hwn*_*wnd 37

PCRE和换行符

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

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

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

preg_match('~\R~', $string);
Run Code Online (Sandbox Code Playgroud)

这相当于以下组:

(?>\r\n|\n|\r|\f|\x0b|\x85)
Run Code Online (Sandbox Code Playgroud)

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

preg_match('~\R~u', $string);
Run Code Online (Sandbox Code Playgroud)

u(unicode的)改性剂导通的PCRE附加功能和模式字符串被视为(UTF-8 ).

相当于以下组:

(?>\r\n|\n|\r|\f|\x0b|\x85|\x{2028}|\x{2029})
Run Code Online (Sandbox Code Playgroud)

它可以限制\R匹配CR,LFCRLF只:

preg_match('~(*BSR_ANYCRLF)\R~', $string);
Run Code Online (Sandbox Code Playgroud)

相当于以下组:

(?>\r\n|\n|\r)
Run Code Online (Sandbox Code Playgroud)

额外

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

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

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

  • 此答案已添加到[Stack Overflow Regular Expression FAQ](http://stackoverflow.com/a/22944075/2736496)的"Escape Sequences"下. (3认同)

Ola*_*che 7

这并没有回答替代品的问题,因为\v效果非常好

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

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

  • "#\\v+#" 逃避反斜杠

要么

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

在这两种情况下,你会得到的任意组合的匹配\r\n.

更新:

perlrebackslash\v开始\R,只是为了明确范围

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


p.s*_*w.g 5

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

preg_match('#[\xD\xA]+#', $string)
Run Code Online (Sandbox Code Playgroud)

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