这在使用 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”额外字典的步骤:
- 下载该语言的 .dic 文件(所有单词的列表)
- 使用 grep 过滤包含非 ascii/可替换字符的单词
- 连续使用正则表达式替换使单词不区分重音
- 在 IDE 中导入 asciified .dic 文件(除了标准语言词典)
最佳答案
所有这些的一个实用方法是使用 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' <<< 'à'
关于regex - 如何在 perl regex 替换命令中使用 unicode 字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70358309/