perl6否定用户定义的caracter类

lis*_*tor 3 class negation perl6

我试图忽略所有带引号的行,不知何故它是一种onfusing:

> my $y='\"\""';
\"\""
> so $y ~~ m/<-[\"]>/
True                      # $y has a " mark, so I want it to be False
> $y ~~ m/<-[\"]>/
?\?
>  $y ~~ m:g/<-[\"]>/
(?\? ?\?)
> $y ~~ m:g/<-["]>/
(?\? ?\?)
$y ~~ m/<-[\\]>/
?"?
> $y ~~ m/<-[\\\"]>/
False
Run Code Online (Sandbox Code Playgroud)

< - [\"]>与< - ["]>相同吗?

> say '"in quotes"' ~~ / '"' <-[ " ]> * '"'/;
?"in quotes"?
> say 'no "foo" quotes' ~~ /  <-[ " ]> + /;
?no ?
> say 'no "foo" quotes' ~~ /  <-[ \" ]> + /;
?no ?
Run Code Online (Sandbox Code Playgroud)

在perl6文档示例中,https: //docs.perl6.org/language/regexes#Wildcards_and_character_classes ,作者无需转义引号; 但是,我必须逃避它才能工作,< - [\\"]>,即逃脱\和逃避".我误解了什么?

谢谢 !!

Eli*_*sen 6

你不需要逃避字符的类规范里面,除了反斜杠本身:那指定<-[\"]> 一样的<-["]>.并指定<-[\\"]>,表示 \之外的所有字符".

但是,对您来说可能有一种更简单的方法:如果您在字符串中只查找一个(一组)字符,那么contains:

my $y = "foo bar baz";
say $y.contains("oo");    # True
Run Code Online (Sandbox Code Playgroud)

这通过使用单个简单的低级字符串匹配来绕过所有昂贵的正则表达式/语法机制.