10.选择符 正则表达式中“ |”表示选择。 你可以用选择符匹配多个可能的正则表达式中的一个。如果你想搜索文字“cat”或“dog”,你可以用 < <cat |dog> > 。如果你想有更多的选择,你只要扩展列表 < <cat |dog |mouse |fish> > 。 选择符在正则表达式中具有最低的优先级,也就是说,它告诉引擎要么匹配选择符左边的所有表达式,要么匹配右边的所有表达式。 你也可以用圆括号来限制选择符的作用范围。如 < <b(cat |dog)b> > ,这样告诉正则引擎把(cat |dog)当成一个正则表达式单位来处理。 注意正则引擎的“急于表功”性 正则引擎是急切的,当它找到一个有效的匹配时,它会停止搜索。因此在一定条件下,选择符两边的表达式的顺序对结果会有影响。 假设你想用正则表达式搜索一个编程语言的函数列表:Get,GetValue,Set或SetValue。一个明显的解决方案是 < <Get |GetValue |Set |SetValue> > 。 让我们看看当搜索SetValue时的结果。因为 < <Get> > 和 < <GetValue> > 都失败了,而 < <Set> > 匹配成功。因为正则导向的引擎都是“急切”的,所以它会返回第一个成功的匹配,就是“Set”,而不去继续搜索是否有其他更好的匹配。和我们期望的相反,正则表达式并没有匹配整个字符串。 有几种可能的解决办法。 一是考虑到正则引擎的“急切”性,改变选项的顺序,例如我们使用 < <GetValue |Get |SetValue |Set> > , 这样我们就可以优先搜索最长的匹配。 我们也可以把四个选项结合起来成两个选项: < <Get(Value)? |Set(Value)?> > 。 因为问号重复符是贪婪的,所以SetValue总会在Set之前被匹配。 一个更好的方案是使用单词边界: < <b(Get |GetValue |Set |SetValue)b> > 或 < <b(Get(Value)? |Set(Value)?b> > 。 更进一步,既然所有的选择都有相同的结尾,我们可以把正则表达式优化为 < <b(Get |Set)(Value)?b> > 。 11.组与向后引用 把正则表达式的一部分放在圆括号内,你可以将它们形成组。然后你可以对整个组使用一些正则操作,例如重复操作符。 要注意的是,只有圆括号“()”才能用于形成组。“[]”用于定义字符集。“{}”用于定义重复操作。 当用“()”定义了一个正则表达式组后,正则引擎则会把被匹配的组按照顺序编号,存入缓存。 当对被匹配的组进行向后引用的时候,可以用“数字”的方式进行引用。 < <1> > 引用第一个匹配的后向引用组, < <2> > 引用第二个组,以此类推, < <n> > 引用第n个组。 而 < < |