Именованные регулярные выражения не удается захватить в раку - PullRequest
5 голосов
/ 23 марта 2020

Может ли кто-нибудь объяснить, почему захваты (именованные и безымянные) не работают в именованных регулярных выражениях? Я ожидаю, что это то, что я делаю неправильно, но если это так, я не вижу этого. В качестве краткого примера приведен захваченный текст из raku repl.

> my $s = '16.01.2020 09:18 286';
> my $dReg = /^(\d**2)\.(\d**2)\.(\d**4)/;
> $s ~~ /<$dReg>/;
「16.01.2020」
> if $s ~~ /<$dReg>/ { say $0 }
Nil
> my $dReg1 = /^$<day> = (\d**2)\.$<mon> = (\d**2)\.$<year> = (\d**4)/;
/^$<day> = (\d**2)\.$<mon> = (\d**2)\.$<year> = (\d**4)/
> $s ~~ /<$dReg1>/;
「16.01.2020」
> if $s ~~ /<$dReg1>/ { say $<day> }
Nil
> if $s ~~ /^$<day> = (\d**2)\.$<mon> = (\d**2)\.$<year> = (\d**4)/ { say $<day> }
「16」
> if $s ~~ /^(\d**2)\.(\d**2)\.(\d**4)/ { say $0 }
「16」

Ответы [ 2 ]

8 голосов
/ 23 марта 2020

Проблема в том, что используется регулярное выражение - то есть <$dReg>. Любая форма синтаксиса утверждений, начинающаяся с неидентификатора, не фиксируется. Решение состоит в том, чтобы ввести имя для него. Например, это:

my $s = '16.01.2020 09:18 286';
my $dReg = /^(\d**2)\.(\d**2)\.(\d**4)/;
say $s ~~ /<dreg=$dReg>/;

Результат:

「16.01.2020」
 dreg => 「16.01.2020」
  0 => 「16」
  1 => 「01」
  2 => 「2020」

Затем вы получите доступ к снимкам как $<dreg>[0]. Это связано с тем, что каждый уровень вызова правил подразумевает уровень вложенности в регулярных выражениях Raku. Это то, что позволяет им масштабироваться до полной грамматики.

Обратите внимание, что вполне нормально - и более эффективно - сопоставлять переменную, содержащую регулярное выражение, если это все, что вам нужно сделать sh. В этом случае вы получите снимки напрямую. Например, это:

my $s = '16.01.2020 09:18 286';
my $dReg = /^(\d**2)\.(\d**2)\.(\d**4)/;
say $s ~~ $dReg;

Производит:

「16.01.2020」
 0 => 「16」
 1 => 「01」
 2 => 「2020」
4 голосов
/ 23 марта 2020

См. Ответ jnthn.

Другой вариант - объявить именованное регулярное выражение (которое не то же самое, что переменная, которая имеет имя и содержит регулярное выражение). Например:

my $input = 'foo';
my regex dreg { 'foo' }
if $input ~~ /<dreg>/ { say $<dreg> } # 「foo」
...