答案 0 :(得分:2)
你为什么感到惊讶? .*
匹配任意数量的字符,包括0。
所以你得到一个包含整行的匹配,以及第二个匹配,它包含第一个匹配和字符串结尾之间的空字符串。
正则表达式不仅处理字符,还处理字符之间的位置(称为anchors)。例如,^
匹配之前的位置第一个字符,$
匹配字符串中最后一个字符后的位置。
正则表达式引擎“遍历”一个字符串,从第一个字符前的位置开始。然后它一次前进一个角色。
例如,将正则表达式.*
应用于"Hello"
时,正则表达式引擎会在H
之前启动。然后匹配Hello
- 之后.*
无法匹配任何其他字符,因此正则表达式引擎返回"Hello"
作为第一个匹配项。正则表达式引擎现在位于o
之后。如果再次调用它并要求它匹配,它将成功返回一个匹配,因为你要求它匹配当前位置的任何字符串,甚至是空字符串 - 这是可能的。
为什么正则表达式引擎不返回无限数量的空字符串呢?它检查最后一个匹配是否从字符串的结尾开始,如果是,则不会再尝试匹配。
有些语言甚至没有尝试从字符串中的最终位置进行一次正则表达式匹配(Ruby似乎是一个例子),但我会说返回两个匹配更正确。
因为看起来需要更多说明:正则表达式引擎沿着|
下面显示的位置逐步执行字符串:
"|H|e|l|l|o|"
^ Position before the first character
^ Position after the last character