+ -
当前位置:首页 → 问答吧 → Perl6 正则表达式增强之定制字符集合

Perl6 正则表达式增强之定制字符集合

时间:2010-08-01

来源:互联网

Perl6 的正则表达式功能得到了极大的增强。再一次史无前例地占领了字符串模式匹配领域的高地。
下面就以其中一个小小的特性为例,介绍一下这种变化。

Perl5 里面,如果我想要匹配几个字母之一的话,用这个语法:

$str =~ /[abcde]/;

如果字符集合比较大,恰巧又是连续的,那么还可以有一种缩写方式:

$str =~ /[a-z]/;

这个功能非常有用,并且许多正则表达式引擎都提供了,想必用过的人也不在少数,
那么,大家有没有想过,其实这个功能还是不够强大,比如下面这个需求就实现不了了:

【请匹配一个辅音字母,后面跟一个元音字母】

$str =~ /[a-z][aeiou]/?     不对。
$str =~ /[^a-z][aeiou]/?  也不对。
然后你只好老老实实地把 19 个辅音字母挨个儿傻傻地敲一遍。

实际上我们在这里需要的是一种集合的减法:也就是从全部 26 个字母中,减掉 aeiou 5 个元音字母和 yw 两个半元音字母。

Perl6 很好地支持了这种需求:

$str ~~ m/ <[a..z]-[aeiouyw]> /;

注意这里用到了 < [] - [] > 这种形式,这种形式表示两个集合的减法。
此外你还可以用加法:

<[a..z]+[0..9]>

或者对集合取反:

<-[aeiou]>

有关这个特性就先介绍到这里。大家有兴趣的可以先安装一个 rakudo star 学习一下(里面有一个 pdf 和一个解释器环境)
下载链接:
http://github.com/rakudo/star/downloads

作者: flw   发布时间: 2010-08-01

$str =~ /[a-z](?<![aeiouyw])[aeiou]/

作者: 黑色阳光_cu   发布时间: 2010-08-01