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?/ 也能达到效果。再看看下面的例子: