将findText()用于多个事件时的额外匹配

时间:2016-04-13 07:59:50

标签: javascript regex google-apps-script

我正在尝试使用带有以下代码的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)函数的正确方法应该是什么?

2 个答案:

答案 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);
  }

enter image description here

或者使用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);
}

enter image description here

答案 1 :(得分:0)

试试这个

var re = /[\u30A0-\u30FF]+/g; 
var str = 'キンメダイの切り身に包丁目を入れ(火通りをよくし、味をしみ込みやすくするため)、熱湯をかけてすぐに氷水にとる(霜降り)。';
var m;

while ((m = re.exec(str)) !== null) {
    alert(m);
}

输出:

キンメダイ