如何用代码点而不是字形替换Perl 6中的字符串?

Ami*_*oni 8 regex unicode perl6 raku

我需要使用Perl 6从字符串中删除变音符号.我尝试这样做:

my $hum = '????';
$ahm.subst(/<-[\c[HEBREW LETTER ALEF] .. \c[HEBREW LETTER TAV]]>/, '', :g);
Run Code Online (Sandbox Code Playgroud)

我想删除所有不在HEBREW LETTER ALEF(א)和HEBREW LETTER TAV(ת)之间的字符.我希望以下代码返回"חום",但它会返回"חם".

我想会发生的事情是,默认情况下Perl 6由字形工作,认为是一个字素,并删除所有字符.通过字形工作通常是明智的,但在我的情况下,我需要通过代码点来工作.

我试图找到一个能让它通过codepoint工作但却找不到它的副词.也许在Perl 6中还有一种方法可以使用Unicode属性来排除变音符号,或仅包含字母,但我也找不到.

谢谢!

Chr*_*oph 9

我的正则表达式很弱,所以我会选择一个不那么神奇的解决方案.

首先,您可以通过相同标记删除所有标记:

'????'.samemark('a')
Run Code Online (Sandbox Code Playgroud)

其次,您可以通过分解字形.NFD并对各个代码点进行操作 - 例如,只保留带有属性的值Grapheme_Base- 然后重新构造字符串:

Uni.new('????'.NFD.grep(*.uniprop('Grapheme_Base'))).Str
Run Code Online (Sandbox Code Playgroud)

如果是混合字符串,希伯来字符的剥离标记可能如下所示:

$str.subst(:g, /<:Script<Hebrew>>+/, *.Str.samemark('a'));
Run Code Online (Sandbox Code Playgroud)


Håk*_*and 3

这是一个简单的方法:

\n\n
my $hum = \'\xd7\x97\xd7\x95\xd6\xbc\xd7\x9d\';\nmy $min = "\\c[HEBREW LETTER ALEF]".ord;\nmy $max = "\\c[HEBREW LETTER TAV]".ord;\nmy @ords;\nfor $hum.ords {\n    @ords.push($_) if $min \xe2\x89\xa4 $_ \xe2\x89\xa4 $max; \n}\nsay join(\'\', @ords.map: { .chr });\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出

\n\n
\xd7\x97\xd7\x95\xd7\x9d\n
Run Code Online (Sandbox Code Playgroud)\n