Sublime文本一次用非重音字符替换多个重音字符

Gab*_*iel 4 regex sublimetext3

我需要用文本文件中的重音替换所有字符,即:

á é í ó ú ñ
Run Code Online (Sandbox Code Playgroud)

因为他们的非重音等价物:

a e i o u n
Run Code Online (Sandbox Code Playgroud)

这可以通过一次性的整个文件的regex命令来实现吗?


更新(2017年2月1日)

我带着极大的答案基思·霍尔,变成了一个崇高的包.你可以在这里找到它:删除非Ascii Chars.

Kei*_*all 14

您可以使用正则表达式:

(?=\p{L})[^a-zA-Z]
Run Code Online (Sandbox Code Playgroud)

找到带有变音符号的字符.

  • (?=\p{L}) 积极前瞻以确保下一个字符是Unicode字母
  • [^a-zA-Z] 否定字符类,以排除没有变音符号的字母.

这是必要的,因为Sublime Text(或者更具体地说,它用于查找和替换的Boost正则表达式引擎)不支持\p{M}.有关元字符的作用的更多信息,请参见http://www.regular-expressions.info/unicode.html\p.


不幸的是,要进行替换,您需要手动指定要替换的字符.为了使其更难,ST似乎不支持POSIX字符等价物,也不支持替换中的条件,这将允许您使用捕获组在一次传递中进行查找和替换.

因此,您需要使用多个查找表达式,如:

[ÀÁÂÃÄÅ]
Run Code Online (Sandbox Code Playgroud)

用...来代替

A
Run Code Online (Sandbox Code Playgroud)

[àáâãäå]
Run Code Online (Sandbox Code Playgroud)

用...来代替

a
Run Code Online (Sandbox Code Playgroud)

等等

这是很多手工工作.


更容易/更快/更少手动工作的方法是使用Python API而不是正则表达式:

  1. 工具菜单 - >开发人员 - >新插件
  2. 粘贴如下:

    import sublime
    import sublime_plugin
    import unicodedata
    
    class RemoveNonAsciiCharsCommand(sublime_plugin.TextCommand):
        def run(self, edit):
            entire_view = sublime.Region(0, self.view.size())
            ascii_only = unicodedata.normalize('NFKD', self.view.substr(entire_view)).encode('ascii', 'ignore').decode('utf-8')
            self.view.replace(edit, entire_view, ascii_only)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将它保存在ST建议的文件夹中(这将是你的Packages/User文件夹),类似于remove_non_ascii_chars.py(文件扩展名很重要,基本名称不是)

  4. 查看菜单 - >显示控制台
  5. 键入/粘贴view.run_command('remove_non_ascii_chars')并按Enter
  6. 变音符号将被删除(带有重音符号的字符将被转换为非重音符号).

注意:上面实际上也会删除所有非ascii字符......

进一步阅读: