我正在尝试为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字母标准化?
答案 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行的任何列中。使用REGEXREPLACE和SPLIT,我们将将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)。
我希望这最终会以一种不太“丑陋”的方式回答您的问题。干杯。