我正在尝试使用带有以下代码的findText在日文文档中找到多个片假名单词(Unicode范围内的一堆字母):
function highlightKatakana() {
var katakana = "[\u30A0-\u30FF]+";
var doc = DocumentApp.getActiveDocument();
var bodyElement = doc.getBody();
var searchResult = bodyElement.findText(katakana);
while (searchResult != null) {
var thisElementText = searchResult.getElement().asText();
Logger.log(thisElementText.getText());
Logger.log("From " + searchResult.getStartOffset() + " to " + searchResult.getEndOffsetInclusive());
searchResult = bodyElement.findText(katakana, searchResult);
}
}
出于某种原因,我不知道,在搜索下一个匹配项时,它从上一个字符的最后一个字符开始,因此它再次匹配为一个字符字。
以下是日志中的示例,它应该只匹配一次:
キンメダイの切り身に包丁目を入れ(火通りをよくし,味をしみ込みやすくするため),热汤をかけてすぐに冰水にとる(霜降り)。 从0到4
キンメダ的イの切り身に包丁目を入れ(火通りをよくし,味をしみ込みやすくするため),热汤をかけてすぐに冰水にとる(霜降り)。 从4到4
由于searchResult是一个只有get方法的RangeElement,因此使用findText(searchPattern,from)函数的正确方法应该是什么?
答案 0 :(得分:1)
这里似乎有一个错误,RangeElement
不会将索引移动到结束+ 1位置。
你可以尝试通过另一次搜索“吃掉”角色来解决这个问题([\s\S]
应提前1个字符):
while (searchResult != null) {
var thisElementText = searchResult.getElement().asText();
Logger.log(thisElementText.getText());
Logger.log("From " + searchResult.getStartOffset() + " to " + searchResult.getEndOffsetInclusive());
searchResult = bodyElement.findText("[\s\S]", searchResult); // <= HERE
searchResult = bodyElement.findText(katakana, searchResult);
}
或者使用JS(类似Tim建议的那样):
var katakana = /[\u30A0-\u30FF]+/g;
var doc = DocumentApp.getActiveDocument();
while ((m=katakana.exec(doc.getBody().getText())) !== null) {
Logger.log("Matched: " + m[0] + ", from " + m.index + " to " + katakana.lastIndex);
}
答案 1 :(得分:0)
试试这个
var re = /[\u30A0-\u30FF]+/g;
var str = 'キンメダイの切り身に包丁目を入れ(火通りをよくし、味をしみ込みやすくするため)、熱湯をかけてすぐに氷水にとる(霜降り)。';
var m;
while ((m = re.exec(str)) !== null) {
alert(m);
}
输出:
キンメダイ