regex - 如何在 perl regex 替换命令中使用 unicode 字符?

这在使用 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”额外字典的步骤:

  1. 下载该语言的 .dic 文件(所有单词的列表)
  2. 使用 grep 过滤包含非 ascii/可替换字符的单词
  3. 连续使用正则表达式替换使单词不区分重音
  4. 在 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' <<< 'à'

https://stackoverflow.com/questions/70358309/

相关文章:

tailwind-css - 如何使用 Tailwind CSS 定位具有特定数据属性的元素?

angular - TS2322 : Type 'HTMLDivElement' is not as

ios - 是否有修改器可以更改 SwiftUI Picker 的标签颜色?

java - 如何删除连续位置的所有重复项?

c++ - 将不同枚举类类型作为输入的函数,怎么样?

c# - 等待似乎没有按顺序执行

powershell - 设置 PSReadLineOption : A parameter can

java - 如何将具有相同键但不同值的多个 map 合并为一个 map

csv - 使用 Sed、Awk 等将第一列中每一行的数据复制到最后一列中的 html 超链接中

python - 如何检查字符串中的特定元素在python中是否相等?