perl6 Как сделать subrule / regex нечувствительным к регистру при использовании в match? - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь сопоставить любые ключевые слова в группе.Ключевые слова находятся в массиве @b.Я не могу делать нечувствительные к регистру совпадения.Я провел некоторое тестирование, и в качестве примера приведен следующий скрипт:

> my $line = "this is a test line";
this is a test line

> my @b = < tes lin > ; 
[tes lin]

> my regex a { || @b };
regex a { || @b }

> say $line ~~ m:i/ <a> /    # matching the first as expected
「tes」
 a => 「tes」

> say $line ~~ m:i:g/ <a> /  # matching both as expected
(「tes」
 a => 「tes」 「lin」
 a => 「lin」)

> my @b = < tes LIN > ; 
[tes LIN]
> my regex a { || @b };
regex a { || @b }
> say $line ~~ m:i:g/ <a> /   # should match both "tes" and "LIN" but skips "LIN"
(「tes」
 a => 「tes」)

> my @b = < TES lin >
[TES lin]
> my regex a { || @b }
regex a { || @b }
> say $line ~~ m:i:g/ <a> /   # expect to match both but skips "TES"
(「lin」
 a => 「lin」)

Кроме того, отображение на все нижние регистры не работает:

> my @b = < TES lin >.lc
[tes lin]
> my regex a { || @b }
regex a { || @b }
> say $line ~~ m:i:g/ <a> /
()

Мой вопрос: как следует-чувствительность будет обрабатываться, когда на самом деле вызывается регулярное выражение?

Я пытался поместить: я наречие внутри регулярного выражения a, но полученные совпадения бесполезны:

> my regex a { :i || @b }
regex a { :i || @b }
> say $line ~~ m:i:g/ <a> /
(「」
 a => 「」 「」

, а затем 19 строк "a =>「 」「 」"

 a => 「」)

Большое спасибо !!!

lisprog

1 Ответ

0 голосов
/ 11 февраля 2019

Проблема с:

my regex a { || @b }
say $line ~~ m:i/ <a> /

В том, что a является регулярным выражением, отвечающим за сопоставление значений в @b, и оно не скомпилировано с :i.
InРегулярные выражения Perl6 - это код, вы не можете изменить работу регулярного выражения на таком расстоянии.

Тогда есть еще одна проблема с:

my regex a { :i || @b }

Это действительно скомпилировано как:

my regex a {
     [ :i    ]
  ||
     [    @b ]
}

Это совпадение ignorecase[nothing], а если это не удастся (не удастся), сопоставьте одно из значений в @b.

Единственная причина использования || @… заключается в том, чточто он соответствует значениям в @… в том порядке, в котором они определены.

> my @c = < abc abcd foo >;

> say 'abcd' ~~ / || @c /
「abc」

Я думаю, что в большинстве случаев было бы лучше, если бы он просто использовал семантику | по умолчанию.

> my @c = < abc abcd foo >;

> say 'abcd' ~~ / |  @c /
「abcd」
> say 'abcd' ~~ /    @c /
「abcd」

Так что тогда все будет работать так, как вы хотите:

my regex a { :i @b }

То есть <a>|<b> будет соответствовать любому самому длинному начальному выражению.Хотя <a>||<b> сначала попытается <a>, а если это не удастся, он попытается <b>.


Если вы действительно хотите семантику ||, любой из них будет работать:

my regex a {     ||  :i @b  }
my regex a { :i [||     @b] }

Следующее не имеет || семантики.
На самом деле || ничего не делает.

my regex a {     || [:i @b] }

Это то же самое, что и эти:

my regex a {     |   :i @b  }
my regex a {         :i @b  }
...