perl6 отрицает определяемый пользователем класс символов

Я пытаюсь игнорировать все строки, в которых есть кавычки, как-то это сливается:

> 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

Является ли ‹-[\"]> таким же, как ‹-["]> ?

> 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 , автору не нужно было выходить из кавычек; однако мне нужно сбежать, чтобы он работал, ‹-[\\"]> , т. е. escape \ и escape ". Что я неправильно понял?

Спасибо !!


person lisprogtor    schedule 11.06.2017    source источник


Ответы (1)


Вам не нужно экранировать символы внутри спецификации класса символов, за исключением самой обратной косой черты: поэтому указание <-[\"]> то же самое, что и <-["]>. А указание <-[\\"]> указывает на все символы, кроме \ и ".

Однако для вас может быть более простой способ: если вы ищете только один (набор) символов в строке, есть contains:

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

Это обходит весь дорогостоящий механизм регулярных выражений/грамматики, используя одно простое сопоставление строк низкого уровня.

person Elizabeth Mattijsen    schedule 11.06.2017