2016-04-13 16 views
2
使用FINDTEXT()時

我試圖找到使用FINDTEXT用下面的代碼日本文檔中的多個片假名單詞(一個Unicode範圍內的一串字母):額外的匹配多個ocurrences

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)函數的正確方法是什麼?

回答

1

似乎有一個bug在此處,將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(類似於蒂姆建議):

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

0

試試這個

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

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

輸出:

キンメダイ