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

Bob*_*Bob 3 php regex

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

<?php

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

?>
Run Code Online (Sandbox Code Playgroud)

为什么?

常用表达

zig*_*don 7

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

看看这本书的链接,看起来似乎有一个错误:

必须以小写字母结尾

仅当正则表达式使用a锚定到字符串的末尾时才会出现这种情况$.

  • 那么,RE引擎的工作方式,它会首先尝试*匹配所有3个字符,但是它确实无法匹配.此时,引擎将*回溯*,删除一个'a`匹配,然后从那一点再试一次.只有这样,因为`[0-9]`是可选的,匹配才会成功. (2认同)