PHP正则表达式:如何在不使用[\r\n]的情况下匹配\r和\n?
我已经测试了PHP正则表达式:如何在不使用[\r\n]的情况下匹配\r和\n?,php,regex,newline,pcre,Php,Regex,Newline,Pcre,我已经测试了\v(垂直空白)是否匹配\r\n及其组合,但我发现\v与\r和\n不匹配。下面是我正在使用的代码 $string = " Test "; if (preg_match("#\v+#", $string )) { echo "Matched"; } else { echo "Not Matched"; } 更清楚地说,我的问题是,是否有其他方法可以匹配\r\n?要匹配给定字符串的每一行,只需使用^$锚定并建议您的正则表达式引擎在多行模式下运行。然后,^$将匹配每行的开始和结
\v
(垂直空白)是否匹配\r\n
及其组合,但我发现\v
与\r
和\n
不匹配。下面是我正在使用的代码
$string = "
Test
";
if (preg_match("#\v+#", $string )) {
echo "Matched";
} else {
echo "Not Matched";
}
更清楚地说,我的问题是,是否有其他方法可以匹配
\r\n
?要匹配给定字符串的每一行,只需使用^$
锚定并建议您的正则表达式引擎在多行模式下运行。然后,^$
将匹配每行的开始和结束,而不是整个字符串的开始和结束
在PHP中,这将是模式后面的m
修饰符<代码>/^(.*?$/m将简单匹配每一行,由给定字符串内的任何垂直空格分隔
顺便说一句:对于行拆分,您还可以使用split()
和PHP\u EOL
常量:
$lines = explode(PHP_EOL, $string);
问题是您需要多行选项,如果使用点,则需要dotall选项。它位于分隔符的末尾
要匹配PHP中的换行符,请使用PHP常量
PHP\u EOL
。这是跨平台的
if (preg_match('/\v+' . PHP_EOL ."/", $text, $matches ))
print_R($matches );
如果有一些奇怪的要求阻止您在模式中使用文字
[\r\n]
,则始终可以使用十六进制转义序列:
preg_match('#[\xD\xA]+#', $string)
这是一种模式,相当于PCRE和换行符
有多余的换行符相关的逃逸序列和替代品
嗯,这里可以使用的一个漂亮的转义序列是\R
。默认情况下,\R
将匹配Unicode换行符序列,但可以使用不同的选项进行配置
匹配ASCII
范围内的任何Unicode换行符序列
preg_match('~\R~', $string);
这相当于以下组:
(?>\r\n|\n|\r|\f|\x0b|\x85)
(?>\r\n|\n|\r|\f|\x0b|\x85|\x{2028}|\x{2029})
(?>\r\n|\n|\r)
匹配任何Unicode换行符序列;包括
ASCII
范围之外的换行字符以及行分隔符(U+2028
)和段落分隔符(U+2029
),您希望启用U
(unicode)标志
u
(unicode)修饰符打开PCRE的附加功能,模式字符串被视为(UTF-8)
该组等效于以下组:
(?>\r\n|\n|\r|\f|\x0b|\x85)
(?>\r\n|\n|\r|\f|\x0b|\x85|\x{2028}|\x{2029})
(?>\r\n|\n|\r)
可以限制
\R
仅与CR
、LF
或CRLF
匹配:
preg_match('~(*BSR_ANYCRLF)\R~', $string);
该组等效于以下组:
(?>\r\n|\n|\r|\f|\x0b|\x85)
(?>\r\n|\n|\r|\f|\x0b|\x85|\x{2028}|\x{2029})
(?>\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+#”
\r
和\n
任意组合的匹配
更新:
为了使\v
的范围与\R
相比更加清晰,请参见
- \R
匹配通用换行符;也就是说,任何被Unicode认为是换行符序列的东西。这包括由\R
(垂直空白)匹配的所有字符\v
此正则表达式还匹配换行符
\n
和回车符\r
字符
(?![ \t\f])\s
要匹配一个或多个换行符或回车符,可以使用下面的正则表达式
(?:(?![ \t\f])\s)+
我想你可以用
\s+
吧。你不想使用\r\n
的原因是什么?@Jerry:\s匹配任何空格是的,我知道,但你要求另一个匹配\r\n
,而\r\n
确实匹配。@Jerry:好的,但不仅仅是macthes\r\n,我猜\v会这样做,但它不会t@Jerry看我下面的答案,您可以使用PCRE中使用的\R
而不是\s
。小心贪婪的匹配!您可能会得到太多。这不符合\r\n多行模式无关。许多正则表达式用户得出这样的结论:只要目标字符串包含行分隔符,就必须指定多行模式。它所做的只是调整锚点(^
和$
)的行为,以便它们在线边界(即线分隔符之前和之后)匹配。OP的正则表达式不包含任何锚。哇!我从来没有用过它,这就是我要找的:)看这个例子:这个答案被添加到了,在“转义序列”下,+1代表\R
。仅出于学术目的,如果您不处于u
模式,您可以发明另一种匹配\r
或\n
的方法,而不使用它们:(?![\t\cK\f])\s
为什么?因为\s
匹配[\t\cK\f\r\n]
,所以这是类减法的一种形式:小心。我在使用俄语单词的捕获组“~\R~”时遇到问题。当该正则表达式应用于单词“ббббббб”时,它变为“ббб”� @PedroSousa为什么省略了u
pattern修饰符?当您想要读取输入字符串中的多字节字符时,需要告诉正则表达式引擎。