在Perl 6中使用修饰符符号制作字符类

时间:2018-10-29 20:14:26

标签: perl6

我想创建一个用户定义的“元音”字符类,它将与任何原义的英语元音字母(a,e,i,o,u)以及任何这些带有变音符号的字母匹配:ắḗú̱åų̄ẹ́等

这是我试图做的,但是没用:

> my $vowel = / <[aeiou]> <:Sk>* /
/ <[aeiou]> <:Sk>* /
> "áei" ~~ m:g/ <$vowel> /
(「e」 「i」)

2 个答案:

答案 0 :(得分:9)

您可以尝试使用ignoremark

  

:ignoremark或:m副词指示正则表达式引擎仅   比较基本字符,并忽略其他标记,例如合并   口音。

例如:

my $vowel = /:m<[aeiou]>/;
.say for "áeikj" ~~ m:g/ <$vowel> /;

输出

「á」
「e」
「i」

答案 1 :(得分:9)

无法使用/ <[aeiou]> <:Sk>* /将元音与组合字符匹配的原因是,Perl 6中的字符串是在字素级别上操作的。在该级别上,ų̄已经仅仅是一个字符,而<[aeiou]>作为字符类已经匹配了一个完整的字符。

正如霍恩在另一个答案中指出的那样,正确的解决方案是使用ignoremark副词。您可以将其放在rx:m/ <[aeiou]> /之类的正则表达式之前或内部,甚至可以使用:m:!m在不同的位置打开和关闭它。