1.7.1 数量词 BACKWARDFORWARD


我们谈的字符和字符类都匹配单个字符。为了一个完整的词�我们说你能用+匹配多个字符。"+"是一类数量词, 还有其他的数量词。(这些放在被�定数量的�之后。)

数量词的最一般形式是指定一个�所能匹配的最大次数和最小次数。你把这两个数放在花括号中�并由逗号隔开。例如�如果你�匹配North American的电话号码,/7,11/将至少匹配7位数字, 但不超过11位。如果你在花括号中放一个单个数字�那么这个数指定了最大和最小次数�即�这个数指定了该�所能匹配的次数。(如果你�问题的话, 你知道所有没有数量词的�有一个隐含的数量词�1�。)

如果你放一个最小数和一个逗号但省去最大数, 那么这个最大数是无�的。也就是说�它至少匹配最小的次数�并且可以匹配它所能匹配的任意多的次数。例如�/7/将只匹配一个地方(North American)的电话号码(7位), 而/7,/将匹配任意的电话号码, 甚至一个国际电话号码(除非它是小于7位的)。没有特别的方法指定字符的最大数。例如, 为找到最多5个任意的字符, 只能说/.0,5/。

因为最大和最小数的组合经常发生�所以Perl为他们定义了特别的数量词。我们已看到+, 它和1,�同, 或者是"至少匹配一次"。也有一个"*", 它和0,�同, 或者是"零或多个匹配次数", 而"?", 和0,1�同, 或者"匹配零次或一次"(即, 是可选的)。

有一些需要你小心的有关数量的事情。首先�Perl规则表达式, 由于缺省是"贪婪的"。这就是说他们尽可能匹配所能匹配的整个表达式。例如�如果你正对下面 "1234567890"进行匹配操作/+/, 那么将匹配整个字符串。当你使用".", 任意字符时, 这就是你要特别观察。有人经常地有下列一个字符串�

spp:Fe+H20=Fe02;H:2112:100:Stephen P Potter:/home/spp:/bin/tcsh

并�用/.+:/匹配"spp"。但因为规则表达式是贪婪的�这个句型将匹配所有能匹配的�并包括“/home/spp"。有时通过使用一个否定的字符类�即�/[^:]+:/来避免这个, 也就是说匹配一个或多个非冒号字符(尽可能多地), 直到第一个冒号为止。正是"^"给出了字符类的否定意义[4]。另一点要注意的是�规则表达式将尽可能早地匹配。这个比贪婪性的优先权还高。因为从左至右扫描�这就是说句型尽可能从左边匹配�既使其他的地方能匹配更长的。(规则表达式虽然是贪婪的, 但并不延迟匹配)例如, 假设你正使用替代命令(s///)对缺省空间(即, 变量$_)操作, 打算从字符串的中间移去一串"x"。如果你这样�

$_ = "fred xxxxxxx barney";

s/x*//;

它将绝对不起作用。这是因为x*(意思是零个或多个"x"字符)在这个串的开始匹配空, 而空串正好是零个长的字符, 并且在"fred"的"f"前有一个空串[5]。   

有另一件事你需要知道。缺省的数量词应用到单个字符后�所以/bam2/将匹配"bamm", 但不是"bambam"。为把一个数量词用到多个字符时�使用括号。所以为匹配"bambam"使用句型/(bam)2/。


Copyright: NPACT BACKWARDFORWARD