代码之家  ›  专栏  ›  技术社区  ›  Chunky Chunk

将字符串字符英语化的正则表达式?

  •  1
  • Chunky Chunk  · 技术社区  · 14 年前

    是否有一个通用正则表达式可以替换非英语语言中所有已知的特殊字符:

    é, ô, ç, etc.
    

    英文字符:

    e, o, c, etc.
    
    3 回复  |  直到 10 年前
        1
  •  3
  •   Bart Kiers    14 年前

    不,没有这样的正则表达式。注意,使用regex可以“描述”一段特定的文本。

    某些regex实现可能提供使用regex进行替换的可能性,但这些替换通常只由单个替换执行:而不是替换 a 具有 a' b 具有 b' 等。

    也许您使用的语言在其API中有一个方法来执行这种替换,但它不会使用regex。

        2
  •  11
  •   tchrist    14 年前

    乌普一

    这是做不到的,你不应该想做!这是对全世界的冒犯,而且相信faÃade与arcade押韵,或者认为CaÃon City,Colorado属于教规,这是一种无知。

    您可以通过Unicode规范化表单D运行字符串并丢弃标记字符,但我肯定不会告诉您如何操作,因为它是 邪恶与错误 . 它是邪恶的,原因已经概述过了,它是错误的,因为它根本没有解决无数的案例。

    学习材料

    以下是您需要阅读的内容:

    • Unicode Normalization Forms - UAX #15 本附件描述了Unicode文本的规范化表单。当实现以规范化的形式保留字符串时,可以确保等价字符串具有唯一的二进制表示。本附录还提供了示例、有关Unicode文本规范化的附加规范,以及有关Unicode规范化表单一致性测试的信息。
    • Canonical Equivalence in Applications - UTN #5 本文档描述了在规范等价下高效处理文本的方法和格式,如UAX#15 Unicode规范化表单[UAX15]中所定义。
    • Unicode Collation Algorithm - UTS #10 此报表是Unicode排序算法(UCA)的规范,详细说明如何比较两个Unicode字符串,同时保持符合Unicode标准的要求。UCA还提供默认Unicode排序规则元素表(DUCET)作为指定所有Unicode字符的默认排序规则顺序的数据。

    必须 学习如何用一种有意义的方式来比较字符串,而对它们进行肢解根本没有任何意义 [p™Ê‡l™p] 永远。

    决不能只是逐代码点比较未格式化的字符串,如果可能,还需要考虑语言,因为它们之间的规则不同。

    实例

    无论您使用的编程语言是什么,它都可以帮助您阅读Perls的文档 Unicode::Normalize , Unicode::Collate ,和 Unicode::Collate::Locale 模块。

    例如,要搜索 "MÜSS" 在一个文本中 "muß" 在里面,你可以这样做:

    my $Collator = Unicode::Collate->new( normalization => undef, level => 1 );
                                         # (normalization => undef) is REQUIRED.
      my $str = "Ich muß studieren Perl.";
      my $sub = "MÜSS";
      my $match;
      if (my($pos,$len) = $Collator->index($str, $sub)) {
          $match = substr($str, $pos, $len);
      }
    

    那将 “穆ß” 进入之内 $match .

    这个 Unicode::Collate::Module 支持对这些地区进行裁剪:

     af                Afrikaans
     ar                Arabic
     az                Azerbaijani (Azeri)
     be                Belarusian
     bg                Bulgarian
     ca                Catalan
     cs                Czech
     cy                Welsh
     da                Danish
     de__phonebook     German (umlaut as 'ae', 'oe', 'ue')
     eo                Esperanto
     es                Spanish
     es__traditional   Spanish ('ch' and 'll' as a grapheme)
     et                Estonian
     fi                Finnish
     fil               Filipino
     fo                Faroese
     fr                French
     ha                Hausa
     haw               Hawaiian
     hr                Croatian
     hu                Hungarian
     hy                Armenian
     ig                Igbo
     is                Icelandic
     ja                Japanese [1]
     kk                Kazakh
     kl                Kalaallisut
     ko                Korean [2]
     lt                Lithuanian
     lv                Latvian
     mk                Macedonian
     mt                Maltese
     nb                Norwegian Bokmal
     nn                Norwegian Nynorsk
     nso               Northern Sotho
     om                Oromo
     pl                Polish
     ro                Romanian
     ru                Russian
     se                Northern Sami
     sk                Slovak
     sl                Slovenian
     sq                Albanian
     sr                Serbian
     sv                Swedish
     sw                Swahili
     tn                Tswana
     to                Tonga
     tr                Turkish
     uk                Ukrainian
     vi                Vietnamese
     wo                Wolof
     yo                Yoruba
     zh                Chinese
     zh__big5han       Chinese (ideographs: big5 order)
     zh__gb2312han     Chinese (ideographs: GB-2312 order)
     zh__pinyin        Chinese (ideographs: pinyin order)
     zh__stroke        Chinese (ideographs: stroke order)
    

    你有一个选择:你可以做正确的,或者你根本做不到。 如果你做错了,没人会感谢你的。

    做得好就意味着要考虑UAX#15和UTS#10。

    在这个时代,没有比这更糟的事了。你知道,现在已经不是60年代了!

        3
  •  0
  •   Gareth    14 年前

    这个任务就是 iconv 图书馆是用来的。了解如何使用你正在开发的语言。

    很可能你的库已经有了一个绑定