Perl6:如何在用户定义的字符类或范围中使用<alpha>?

时间:2017-01-17 00:22:31

标签: regex range match perl6

我正在尝试匹配任何字母字符和&#34;,&#34;或&#34;;&#34;而我正在尝试使用&#34; &LT;:L&GT;字母字符&#34;根据文件https://docs.perl6.org/language/regexes。但是,编译器抱怨。不使用a..zA..Z的正确方法是什么?

say "a,b,c;d,e;xyz" ~~ m/ <[ <alpha> \, \; ]>+ /;

错误讯息:

Potential difficulties:
    Repeated character (a) unexpectedly found in character class
    at C:\Users\Guest\Documents/avg.pl:128
    ------> ay "a,b,c;d,e;xyz" ~~ m/ <[ <alpha> \, \<HERE>; ]>+ /;

非常感谢!!

2 个答案:

答案 0 :(得分:5)

您无法在Enumerated Character Class<alpha>语法)中使用<[ ... ]>之类的子规则。正确的枚举字符类的示例是<[abc]>以匹配字符'a','b'或'c'。您编写了一个以<[ <alpha> ...开头的枚举字符类。这枚举了字符'&lt;','a','l','p','h','a' - 然后编译器抱怨说“在字符类中意外发现重复字符(a)”

  

这样做的正确方法是什么

将相应的Unicode property:L)添加到包含,;的枚举字符类中,如下所示:

say "a,b,c;d,e;xyz" ~~ / <+ :L + [,;] >+ /;

我们所链接的文档最接近于解释这个(超级简洁地)在“一个人可以写&lt;:Ll +:N&gt;”的位附近。请注意,关于空格的语法很有用。 (如果你弄错了,它通常会无法匹配。)

答案 1 :(得分:4)

您可以与&lt; alpha&gt;结合使用太:

say "a,b,c;d,e;xyz" ~~ m/ <[,;] + alpha>+ /

正如另一个答案中所提到的,Enumerated character classes文档描述了组合字符类。