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

标签 regex perl unicode command-line utf-8

这在使用 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' <<< 'à'

关于regex - 如何在 perl regex 替换命令中使用 unicode 字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70358309/

相关文章:

c - 为什么在 char 中存储 Unicode 字符有效?

c++ - 如何使用正则表达式匹配仅包含中文字母的字符串?

django - 在Django管理员中上传文件时出现UnicodeEncodeError

asp.net 验证表达式带前导零的军事时间

perl - Mac M1 Homebrew Perl Carton Net::SSLeay 正在以不安全的方式加载 libcrypto

regex - 为 CGI 输入域名的 Perl 污染模式导致 “Insecure dependency in eval”

perl - 使用 NonStop 调试器选项时如何将 perl 脚本的调试跟踪重定向到文件?

java - 如何使用正则表达式分割字符串文件名?

ruby - 使用递归正则表达式(如 perl)在 Ruby 中匹配平衡括号

python - Pandas 正则表达式提取网络IP地址子串