Создание класса символов с символами-модификаторами в Perl 6 - PullRequest
0 голосов
/ 29 октября 2018

Я хотел бы создать пользовательский класс символов «гласные», который будет соответствовать любой буквенной английской гласной букве (a, e, i, o, u), а также любой из этих букв с любыми возможными диакритическими знаками. : ắ ḗ ú̱ å ų̄ ẹ́ и т. д.

Это то, что я пытался сделать, но это не работает:

> my $vowel = / <[aeiou]> <:Sk>* /
/ <[aeiou]> <:Sk>* /
> "áei" ~~ m:g/ <$vowel> /
(「e」 「i」)

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Причина, по которой вы не можете сопоставить гласный с комбинированным символом, используя / <[aeiou]> <:Sk>* /, заключается в том, что строки в Perl 6 работают на уровне графемы. На этом уровне ų̄ уже является одним символом, а <[aeiou]> как класс символов уже соответствует одному целому символу.

Правильное решение, как указал Хокон в другом ответе, - использовать наречие ignoremark. Вы можете поместить его перед регулярным выражением, например rx:m/ <[aeiou]> / или внутри него, или даже включать и выключать его в разных точках с помощью :m и :!m.

0 голосов
/ 29 октября 2018

Вы можете попробовать использовать ignoremark :

Наречие: ignoremark или: m указывает движку регулярных выражений только сравнивать базовые символы и игнорировать дополнительные метки, такие как объединение акценты.

Для вашего примера:

my $vowel = /:m<[aeiou]>/;
.say for "áeikj" ~~ m:g/ <$vowel> /;

выход

「á」
「e」
「i」
...