|
当需要解析复杂的正则表达式时,你应当像Perl 那样使用优先级表来理解它。
例如,/^fred|barney$/很可能并不是程序员想要的模式。由于竖线(|)的优先级最低;它将上述模式分成了两部分。这个模式
在或者开头是fred,或者结尾是barney 时匹配上。很可能程序员想要的是(^(fred|barney)$),这将匹配只有fred 或者只有barney
的行◆。那/(wilma|pebbles?)/呢?问号也对前面的元素有效◆,它将匹配wilma, pebbles, 或者pebble,可能是某个长字符串
的一部分(因为没有锚定)。
◆当然,结尾处可以有换行符,我们在早期讨论$锚定时提到过。
◆因为数量词?和字母s 结合更紧密
模式/^(\w+)\s+(\w+)$/将匹配那些含有一个“词(word)”,一些空白,另一个“词(word)”,之外没有其它符号的行。
它将匹配上像fred flintstone 这样的行。模式中的括号是不需要的,当然它们可以将匹配上的字符串存放在$1,$2 之中。
当解析复杂的正则表达式时,括号将有助于你区分优先级。可以这样做,但请记住,如果使用了括号,则这些括号所匹配
的字符串将放在相应的内存变量之中($1,$2...)之中。当添加新的括号时也可能需要改变这些以前的编号◆。
◆察看perlre 的帮助手册了解更多的不会引起内存分配的括号,它们仅是用来分组。 |
|