perl6否定用户定义的caracter类

时间:2017-06-11 19:14:21

标签: class perl6 negation

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

> 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

是&lt; - [\&#34;]&gt;与&lt; - [&#34;]&gt;相同?

> say '"in quotes"' ~~ / '"' <-[ " ]> * '"'/;
「"in quotes"」
> say 'no "foo" quotes' ~~ /  <-[ " ]> + /;
「no 」
> say 'no "foo" quotes' ~~ /  <-[ \" ]> + /;
「no 」

在perl6文档示例https://docs.perl6.org/language/regexes#Wildcards_and_character_classes中,作者无需转义引号;但是,我必须逃避它的工作,&lt; - [\\&#34;]&gt; ,即逃脱\并逃脱&#34;。我误解了什么?

谢谢!

1 个答案:

答案 0 :(得分:6)

除了反斜杠本身之外,您不需要转义字符类规范中的字符:因此指定<-[\"]> <-["]>相同。并指定<-[\\"]>,表示除 \"之外的所有字符

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

my $y = "foo bar baz";
say $y.contains("oo");    # True

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