php - PHP 正则表达式中的 ^$ 和 $^ 是否相同?

标签 php regex preg-match anchor pcre

为什么这两个正则表达式都匹配成功?

if(preg_match_all('/$^/m',"",$array))
  echo "Match";

if(preg_match_all('/$^\n$/m',"\n",$array))
  echo "Match";

最佳答案

$^ 是零宽度元字符。与一次匹配一个字符(除非与量词一起使用)的其他元字符(如 .)不同,它们实际上并不匹配文字字符。这就是 ^$ 匹配空字符串 "" 的原因,即使正则表达式(无定界符)包含两个字符而空字符串包含零也是如此。

空字符串不包含任何字符并不重要。它仍然有一个起点和一个终点,因为它是一个空字符串,所以两者都在同一个位置。因此,无论您使用 ^$ 的顺序或数量如何,它们的所有排列都应与空字符串匹配。


您的第二种情况稍微棘手一些,但适用相同的原则。

m 修饰符 (PCRE_MULTILINE) 只是告诉 PCRE 引擎一次性输入整个字符串,而不考虑换行符,但字符串仍然包含“多行”。然后它将 ^$ 分别视为“一行的开始”和“一行的结束”。

字符串"\n"本质上在逻辑上分为三部分:"""\n"""(因为换行符被空虚包围了……听起来很有诗意)。

然后这些匹配如下:

  1. 第一个空字符串与开头的 $^ 匹配(正如我上面所解释的)。

  2. \n 与正则表达式中的相同 \n 匹配。

  3. 第二个空字符串与最后一个$匹配。

这就是您的第二个案例导致匹配的方式。

关于php - PHP 正则表达式中的 ^$ 和 $^ 是否相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6390059/

相关文章:

php - preg_match 验证 URL slug

PHP header 重定向不起作用并停留在 login.php 上

php - 使用AJAX插入记录不插入和刷新页面

php - Facebook iOS 更新 : integrated the conversions APIs with native php

python - 正则表达式以匹配 Python 中设置的 rar 存档文件中的第一个文件

php - 正则表达式替换周围的字符,同时保留之间的字符串

PHP EXIF 数据不工作

javascript - 在 JavaScript 中,正则表达式是否在编译代码中求值?

javascript - 替换 JavaScript 中的表情符号列表

php preg_match() 多种模式