为什么这两个正则表达式都匹配成功?
if(preg_match_all('/$^/m',"",$array))
echo "Match";
if(preg_match_all('/$^\n$/m',"\n",$array))
echo "Match";
最佳答案
$
和 ^
是零宽度元字符。与一次匹配一个字符(除非与量词一起使用)的其他元字符(如 .
)不同,它们实际上并不匹配文字字符。这就是 ^$
匹配空字符串 ""
的原因,即使正则表达式(无定界符)包含两个字符而空字符串包含零也是如此。
空字符串不包含任何字符并不重要。它仍然有一个起点和一个终点,因为它是一个空字符串,所以两者都在同一个位置。因此,无论您使用 ^
和 $
的顺序或数量如何,它们的所有排列都应与空字符串匹配。
您的第二种情况稍微棘手一些,但适用相同的原则。
m
修饰符 (PCRE_MULTILINE
) 只是告诉 PCRE 引擎一次性输入整个字符串,而不考虑换行符,但字符串仍然包含“多行”。然后它将 ^
和 $
分别视为“一行的开始”和“一行的结束”。
字符串"\n"
本质上在逻辑上分为三部分:""
、"\n"
和""
(因为换行符被空虚包围了……听起来很有诗意)。
然后这些匹配如下:
第一个空字符串与开头的
$^
匹配(正如我上面所解释的)。\n
与正则表达式中的相同\n
匹配。第二个空字符串与最后一个
$
匹配。
这就是您的第二个案例导致匹配的方式。
关于php - PHP 正则表达式中的 ^$ 和 $^ 是否相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6390059/