6

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

我看到Google在其“REGEXREPLACE”函数中使用了 RE2。而且我看到RE2 提供了 Unicode 字符类

我试图写一个公式(类似于这个):

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

但是表格会产生以下错误:

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

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

任何人都可以提供一种更好的方法来规范化 Google 表格公式中带有变音符号/重音符号的 Unicode 字母的建议吗?

4

3 回答 3

8

[[:^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 脚本

找到了一个很好的解决方案,它适用于谷歌表格。

于 2016-02-26T12:22:55.390 回答
3

这在 Google Sheets、Google Apps Scripts、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;
}
于 2018-08-05T11:21:43.440 回答
2

这个答案不需要谷歌应用脚​​本,它仍然很快,而且相对简单。它通过提供完整的查找表以Max 的答案为基础,并且还允许区分大小写的音译(通常 VLOOKUP 不区分大小写)。

如果您想直接进入它,这里是指向Google 电子表格的链接。如果您想使用自己的工作表,则需要将 TRANS_TABLE 工作表复制到电子表格中。

在下面的代码片段中,源单元格是A2,因此您可以将此公式放在第 2 行的任何列中。使用REGEXREPLACE AND SPLIT,我们将字符串拆分A2为一个字符数组,然后使用ARRAYFORMULA,我们执行以下操作到数组中的每个字符:首先,将字符转换为其'十进制'代码等效项,然后按该数字与工作表上的表匹配TRANS_TABLE,然后使用VLOOKUP,字符 X 列数(提供的索引值)在 TRANS_TABLE 表上(在这种情况下,第 3 列结束)被返回。当数组中的所有字符都音译完毕后,我们终于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),因此您只需从源 Glyph 列中复制相同的字符。在您确实要转换字符的地方,您输入要替换的任何字符(ñ -> n 等)。如果要完全删除一个字符,请将单元格留空 (? -> '')。

我希望这最终能以一种不那么“丑陋”的方式回答你的问题。干杯。

于 2020-07-26T21:41:45.947 回答