PHP正则表达式中的^ $和$ ^是一样的吗?

nEA*_*nam 9 php regex anchor pcre preg-match

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

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

if(preg_match_all('/$^\n$/m',"\n",$array))
  echo "Match";
Run Code Online (Sandbox Code Playgroud)

Bol*_*ock 11

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

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


你的第二个案例有点棘手,但适用相同的原则.

m修饰符(PCRE_MULTILINE)只是告诉PCRE引擎到整个字符串中一气呵成喂,无论换行,但字符串也包括"多行".然后,它着眼于^$为"行的开始"和"行结束"分别.

字符串"\n"基本上是逻辑上分为三个部分:"","\n"""(因为换行符被空虚包围......听起来很诗意).

然后这些匹配如下:

  1. 第一个空字符串与起始字符匹配$^(如上所述).

  2. \n由同一匹配\n您的正则表达式.

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

这就是你的第二个案例导致匹配的方式.

  • 作为一个有趣的方面,我发现这个场景类似于为什么空字符串是其自身的子串的问题.所以这根本不是一个愚蠢的问题.事实上,我刚刚赞成它! (3认同)