background image

echo $matches['quote'];
所以,有名组并不只是让写代码更容易,它也能用于组织代码。
4. 字词边界(Word Boundaries)
字词边界是字串里的字词字符(包括字母、数字和下划线,自然也包括汉字)和非字

词字符之间的位置。

 

其特殊之处就在于,它并不匹配某个实在的字符。它的长度是零。\b 匹配所有字词边

界。

 

不幸的是,字词边界一般都被忽视掉了,大部分人都没有在意他的现实意义。 例如,

如果你想要匹配单词 import”:

/import/
注意了!正则表达式有时候很调皮的。下面的字串也能和上面的式子匹配成功:
important
你或许觉得,只要在 import 前后加上空格,不就可以匹配这个独立的单词了:
/ import /
那如果遇上这种情况呢:
The trader voted for the import

 

当 import 这个词在字串开头或者结尾时,修改后的表达式仍然不能用。因此,考虑各

种情况是必须的:

/(^import | import | import$)/i
别慌,还没完呢。如果遇到标点符号了呢?就为了满足这一个单词的匹配,你的正则

可能就需要这样写:

/(^import(:|;|,)? | import(:|;|,)? | import(\.|\?|\!)?$)/i
对于只匹配一个单词来说,这样做实在是有点大动干戈了。正因如此,字词边界才显

得意义重大。要适应上述要求,以及很多其他情况变种,有了字符边界,我们所需写的代
码只是:

/\bimport\b/

 

上面所有情况都得到了解决。\b 的灵活性就在于,它是一个没有长度的匹配。它只匹

配两个实际字符之间想象出的位置。它检查两个相邻字符是否是一个为单字,另一个为非

 

单字。情况符合,就返回匹配。如果遇到了单词的开头或结尾, \b 会把它当成是非单词字
符对待。由于 import

 

里面的 i 仍然被看成是单词字符,import 就被匹配出来了。

注意,与\b 相对,我们还有\B,此操作符匹配两个单字或者两个非单字之间的位置。

因此,如果你想匹配在某个单词内部的 hi’,可以使用:

\Bhi\B
“this” “

、 hight”

,都会返回匹配,而 hi there”则不会返回匹配。

5. 最小组团(Atomic Groups)
最小组团是无捕捉的特殊正则表达式分组。通常用来提高正则表达式的效能,也能用

于消除特定匹配。一个最小组团可以用(?>pattern) 来定义,其中 pattern 是匹配式。

/(?>his|this)/
当正则引擎针对最小组团进行匹配时,它会跳过组团内标记的回溯位置。以单词

“smashing”

为例,当用上面的正则表达式匹配时,正则引擎会先尝试在 smashing”里寻找

“his”。显然,找不到任何匹配。此时,最小组团就发挥作用了:正则引擎会放弃所有回溯

位置。也就是说,它不会尝试再从 smashing”

里查找 this”

。为什么要这样设置?因为 his”

都没有返回匹配结果,包含有 his” “

的 this”当然就更匹配不了了!

上面的例子并没有什么实用性,我们用/t?his?/ 也能达到效果。再看看下面的例子: