0

次のテキストがあります。

var text= 
    "The sad sad man uses a bat to swing the bats 
    away from his sad garden .
    Sadly he doesn't succeed. "

という単語を検索したいとしましょう"sad"

var match;
re = /sad/g,
    match;
while (match = re.exec(text)) {
    console.log(match); 
match.poz = ....
}

このようにすべて 0,0 から始まるmatch.pozタプル(配列)にするにはどうすればよいですか?[line,position on the collumn]

例えば。

  • 1 マッチ --> match.poz = [0,4]
  • 2 マッチ --> match.poz = [0,8]
  • 3 マッチ --> match.poz = [1,14]
  • 4 マッチ --> match.poz = [2,0]
4

2 に答える 2

1

正規表現を使用する代わりに、単純なパーサーを構築することができましたが、Javascript で位置を取得することは (多くの助けなしでは) 不可能だと思います。sadこれが行うことは、一度に 1 文字ずつ行を調べて、現在の位置が かかどうかを確認するために前方を「のぞき見」するだけ\nです。

var text = "The sad sad man uses a bat to swing the bats \naway from his sad garden .\nSadly he doesn't succeed.",
    length = text.length,
    matches = [],
    lines = 0,
    pos = 0;

for (var i = 0; i < length; i++){
    var word = text.substring(i, i + 3).toLowerCase();

    if (word == 'sad') {
        matches[matches.length] = [lines, pos];
    }

    if (word.indexOf('\n') == 0) {
        lines++;
        pos = 0;
    } else {
        pos++;
    }
}

console.log(matches);

これにより、Firebug コンソールで次のことがわかります。

[[0, 4], [0, 8], [1, 14], [2, 0]]

http://jsfiddle.net/Zx5CK/1/

于 2012-05-27T23:01:52.340 に答える
0

まず、何らかの方法で行を区切ることができる必要があると思います。入力データに何らかの文字 (たとえば「\n」など) を使用している可能性があります。この問題を解決する 1 つの方法は、split 関数を使用して、各行の単語を配列として取得することです。次に、行と必要な単語を受け取り、各単語を検索対象と比較する関数を作成できます。

 //where i denotes the currently read line.
 var indexInLine = checkforWordInLine(input.line[i].split(' '), "sad");
 if(indexInLine != -1) 
 //word found in line. 
 // save indexInLine and 'i', the line index      


 function checkforWordInLine(line, searchKey)
 {
    var wordIndex = -1;
   for(var i=0,j=line.length; i < j; i++)
   {
      if(line[i] === searchKey)
      wordIndex = i;
   }
   return wordIndex;
 }
于 2012-05-27T22:17:05.607 に答える