这在使用 unicode 字符时不起作用(在 Ubuntu bash 中):
$ perl -pC -e's/[à]/a/gu' <<< 'à'
à
$ perl -pC -e's/[b]/a/gu' <<< 'b'
a
尽管 PCRE 似乎支持它(至少根据 regex101 )。
我做错了什么?我是否在 perl 命令中遗漏了一些标志?
这在 javascript 中“有效”,所以如果我能在命令行中为此想出一个简单的单行代码,我会使用节点……但我仍然想知道为什么 perl 命令不起作用。
对于上下文:
我正在尝试使用 /[àâáãä]/a/g
、/[òôóõö]/o/g
等替换来对字典文件进行 asciify(即删除单词列表的重音等),因此我可以使用它使拼写检查对重音不敏感(例如在 IntelliJ Idea 中)。
基本上这些是制作“asciified”额外字典的步骤:
最佳答案
所有这些的一个实用方法是使用 Text::Unidecode
perl -C -MText::Unidecode -pe'unidecode($_)' <<< 'à'
打印a
。该模块将 Unicode 文本音译为纯 ASCII。
另一种方法:使用 Unicode::Normalize 分解字符(“规范化”) , 所以这个角色和它的 diacritical marks (组合重音)被分成它们自己的代码点,同时它们仍然形成有效的 grapheme ,然后使用简单的正则表达式删除变音符号(\p{NonspacingMark}
或 \p{Mn}
)。
这两种方式都会有异常(exception)和边缘情况,但我认为它可能正好满足您的需要。
对于包含特定(文字)字符的代码,需要通过utf8 pragma告诉Perl程序源是UTF-8。使用 use utf8;
或使用命令行标志 -Mutf8
perl -C -Mutf8 -pe's/[à]/a/g' <<< 'à'
https://stackoverflow.com/questions/70358309/