2016-04-13 3 views
2

Ich versuche, mehrere Katakana Wörter (ein paar Buchstaben in einem Unicode-Bereich) in einem japanischen Dokument mit findtext mit dem folgenden Code zu finden:Extra-Matching, wenn findtext() für mehrere ocurrences mit

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

Für einen Grund, den ich nicht verstehe, wenn ich nach dem nächsten Vorkommen suche, es beginnt mit dem letzten Zeichen des vorherigen Vorkommnisses, und deshalb stimmt es wieder als ein Ein-Zeichen-Wort überein.

Hier ist ein Beispiel aus dem Protokoll ist, sollte es nur einmal entsprechen:

キ ン メ ダ イ の 切 り 身 に 包 丁目 を 入 れ (火 通 り を よ く し, 味 を し み 込 み や す く す る た め), 熱湯 をか け て す ぐ に 氷水 に と る (霜降 り). von 0 bis 4

キ ン メ ダ の 切 り 身 に 包 丁目 を 入 れ (火 通 り を よ く し, 味 を し み 込 み や す く す る た め) 熱湯 を か け12 す ぐ に に に る (霜降 り). Von 4 bis 4

Da searchResult ein RangeElement mit nur get Methoden ist, Was sollte der richtige Weg sein, um die Funktion findText (searchPattern, from) zu verwenden?

Antwort

1

Es scheint, dass es ein Fehler ist hier, und die RangeElement den Index nicht zu Ende + 1-Position bewegen.

Sie könnten versuchen, durch „auffressen“ den Charakter mit einer anderen Suche, um dieses Werk ([\s\S] sollte von 1 Zeichen voran):

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

Oder nutzen JS (ähnlich dem, was Tim schon sagt):

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

Versuchen Sie, diese

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

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

Ausgang:

キンメダイ 
Verwandte Themen