如何在Google表格中规范化/归化Unicode字符?

时间:2016-02-25 23:28:12

标签: regex unicode google-sheets formulas re2

我正在尝试为Google表格编写一个公式,它会将带有变音符号的Unicode字符转换为纯ASCII等效字符。

我在其“REGEXREPLACE”函数中看到Google uses RE2。我看到RE2 offers Unicode character classes

我试着写一个公式(类似于this one):

REGEXREPLACE("público","(\pL)\pM*","$1")

但Sheets会产生以下错误:

  

函数REGEXREPLACE参数2值“\ pL”不是有效的正则表达式。

我想我可以编写一个由一组很长的嵌套SUBSTITUTE函数(Like this one)组成的公式,但这看起来非常糟糕。

是否可以提供更好的方法来建议使用Google表格公式中的带有变音/重音标记的Unicode字母标准化?

3 个答案:

答案 0 :(得分:4)

[[:^alpha:]](否定的ASCII字符类)适用于REGEXEXTRACT公式。

但是=REGEXREPLACE("público","([[:alpha:]])[[:^alpha:]]","$1")给出了“pblic”。所以,我猜,公式不知道确切的ASCII字符必须替换“ú”。

解决方法

我们来看públicē;我们需要替换它中的两个符号。将此单词放在单元格A1中,并将此公式放在单元格B1中:

=JOIN("",ArrayFormula(IFERROR(VLOOKUP(SPLIT(REGEXREPLACE(A1,"(.)","$1-"),"-"),D:E,2,0),SPLIT(REGEXREPLACE(A1,"(.)","$1-"),"-"))))

然后在范围D:E:

中创建替换目录
    D    E  
1   ú   u
2   ē   e
3  ...  ...

此公式仍然很难看,但更有用,因为您可以通过向表中添加更多字符来控制目录。

或使用Java脚本

另外found a good solution,适用于Google表格。

答案 1 :(得分:2)

这是在Google表格,Google Apps脚本,GAS中为我完成的

function normalizetext(text) {
    var weird = 'öüóőúéáàűíÖÜÓŐÚÉÁÀŰÍçÇ!@£$%^&*()_+?/*."';
    var normalized = 'ouooueaauiOUOOUEAAUIcC                 ';
    var idoff = -1,new_text = '';
    var lentext = text.toString().length -1

    for (i = 0; i <= lentext; i++) {
        idoff = weird.search(text.charAt(i));
        if (idoff == -1) {
            new_text = new_text + text.charAt(i);
        } else {
           new_text = new_text + normalized.charAt(idoff);
        }
    }

    return new_text;
}

答案 2 :(得分:0)

此答案不需要Google App脚本,它仍然快速且相对简单。通过提供完整的查找表,它基于Max's答案,并且还允许区分大小写的音译(通常VLOOKUP不区分大小写)。

如果您想直接跳到Google Spreadsheet,请点击这里。如果要使用自己的工作表,则需要将TRANS_TABLE工作表复制到电子表格中。

在下面的代码段中,源单元格为A2,因此您可以将该公式放在第2行的任何列中。使用REGEXREPLACESPLIT,我们将将A2中的字符串转换为字符数组,然后使用ARRAYFORMULA,对数组中的每个字符执行以下操作:首先,将字符转换为其'decimal'{{3 }}等价,然后按该数字与TRANS_TABLE工作表中的表进行匹配,然后使用CODE,即TRANS_TABLE工作表上字符X的列数(提供的索引值)(在这种情况下) ,则返回第3列)。数组中的所有字符均已音译后,我们最终将VLOOKUP个字符数组放回到单个字符串中。 我也提供了JOIN的示例。

=iferror(
join(
  "",
  ARRAYFORMULA(
    vlookup(
      code(split(REGEXREPLACE($A2,"(.)", "$1;"),";",TRUE)),
      TRANS_TABLE!$A$5:$F,3
    )
  )
)
,)

您会在我制作的TRANS_TABLE工作表上注意到,我创建了4个不同的音译列,这使为您的每个音译需求轻松创建一列成为可能。要引用该列,只需在VLOOKUP中使用其他索引号。每列只是一个替换字符列。在某些情况下,您不希望进行任何转换(A-> A或3-> 3),因此只需从源字形列复制相同的字符。您要转换字符的地方,键入要替换的任何字符(ñ-> n等)。如果要完全删除一个字符,则将单元格留空(?->'')。您可以在数据表上看到音译输出的示例,在该数据表中,针对不同的用例场景,我引用了TRANS_TABLE表中的每个音译表,创建了4个不同的音译列(A-D)。

我希望这最终会以一种不太“丑陋”的方式回答您的问题。干杯。