
300
|
第
16
章
练习
16.2
调整上一个练习中的答案,查找名字中有连续
a
(
a
之间也可以有
n
或
s
)的蝴蝶种。
16.1.2
贪婪性
+
和
*
量词是贪婪的,它们会尽可能多地匹配文本。有时,这可能会过多。修改前面
的例子来匹配量词后面的另一个
b
。现在必须至少连续有两个
b
:
my @strings = < Aba Abba Abbba Ababa >;
for @strings {
put $_, ' ', m/ :i ab+ ba / ?? 'Matched!' !! 'Missed!';
}
第一个
Str
不匹配,因为它不满足一个或多个
b
后面跟着另一个
b
。最后一个
Str
也
是如此。中间的两个
Str
有足够的
b
来满足模式的这两个部分:
Aba Missed!
Abba Matched!
Abbba Matched!
Ababa Missed!
不过,下面来考虑匹配方法是如何工作的。它看到
b+
时,会尽可能多地匹配
b
。在
Abbba
中,
b+
首先匹配
bbb
。模式的
b+
部分满足。匹配方法移到模式的下一部分,
即另一个
b
。现在文本中再没有任何
b
来满足这一部分了,因为贪心的量词已经匹配
了所有的
b
。
这个匹配不会失败,因为匹配方法可以使用另一个策略:它可以回溯(
backtrack
)刚
才匹配的量词,要求它放弃一些文本。
b+
需要一个或多个
b
。它匹配两个还是三个并
不重要,因为这都能满足它的要求。在文本中退回一个位置,可以留出一个
b
,使得
下一部分能匹配。一旦退回,它会尝试匹配模式的下一部分。
16.1.3 0
或
1
个
?
量词只匹配