Regexp返回true,但是一本书的作者说它不应该

时间:2012-04-18 22:54:11

标签: php regex

在PHP上阅读有关Regexp(TuxRadar)的在线资源。 根据作者的说法,以下不应该将“aaa1”与模式匹配,因此返回false(0),但我得到了真(1)。

<?php

$str = "aaa1";
print preg_match("/[a-z]+[0-9]?[a-z]{1}/", $str);

?>

为什么?

Regular Expressions

3 个答案:

答案 0 :(得分:7)

你确定那里不应该有$吗?没有它,返回true会很有意义 - 第一个[a-z]块与前两个a个字符匹配,[0-9]不匹配,最后一个[a-z]匹配第三个a。尾随1将被忽略。

查看该书的链接,似乎确实存在错误:

  

必须以小写字母结尾

仅当正则表达式锚定到带有$的字符串末尾时才会出现这种情况。

答案 1 :(得分:3)

匹配,因为[0-9]?匹配数字或一次。

<?php
$str = "aaa1";
print preg_match("/[a-z]+[0-9]+[a-z]{1}/", $str);
?>

不会导致匹配。

答案 2 :(得分:2)

让我们分解正则表达式

  1. [a-z] +表示一个或多个字母,与ga,aa或aaa相匹配
  2. [0-9]?表示可选 - 因此可以匹配数字
  3. [a-z]表示匹配一个字母,可以是
  4. 因此,由于[0-9]是可选的,1匹配aa,2将不匹配,3匹配a