3

さて、そのタイトルは注目を集めました。私はそれを認めます。では質問へ!

概要 HTML タグ (Flash wiki 用) でテキストをタグ付けするプロジェクトに取り組んでいるコードがいくつかあります。自己完結型の別のファイルを作成しました。このファイルは、この質問で明確にするために焦点を当てています。

やりたいこと 入力は、キーワードのリストとテキストのブロックです。この場合、入力は

["panda","tea","tea cup","panda tea cup"];

"Tea is good. I like tea cups, too. Pandas also like tea but need special panda tea cups to drink it.";

予想される出力は次のようになります。

"<Tea> is good. I like <tea cups>, too. <Panda>s also like <tea> but need special <panda tea cups> to drink it.

問題 単純な replace() 関数でこれを行うことができると思っていましたが、すぐに次のようになることに気付きました。

"<Tea> is good. I like <<tea> cups>, too. <Panda>s also like <tea> but need special <<panda> <<tea> cups>> to drink it."

私はしたくない。

最終的に、コードを分割する再帰関数を作成することにしました。この関数は、最も長いキーワードから始めて、最小のキーワードへと進みます。今は完全に混乱していて、recursiveParse エラーが発生し続けています。

完全なコード

//Setup
var kw:Array = ["panda","tea","tea cup","panda tea cup"];
var s:String = "Tea is good. I like tea cups, too. Pandas also like tea but need special panda tea cups to drink it.";
var openTag:String = "<<";
var closeTag:String = ">>";
var tS:Array = [];
//Sort by length (longest to shortest)
for (var i:int = 0; i<kw.length; i++) {
    for (var j:int = kw.length - 1; j > i; j--) {
        if (kw[j - 1].length < kw[j].length) {
            var temp:String = kw[j - 1];
            kw[j - 1] = kw[j];
            kw[j] = temp;
        }
    }
}
//Parse
tS[0] = s;
s = recursiveParse(s);
var n:int = 0;
function recursiveParse(m:String) {
    var tP = kw[n];
    if (m.length == 0) {
        return "test";
    }
    var p:RegExp = new RegExp(tP,"gi");
    m = m.replace(p,openTag + "$&" + closeTag);
    tP = "[<>]";
    p = new RegExp(tP);
    var b:Array = m.split(p);
    var fI:String = "";
    n++;
    for each (var f in b) {
        if (f.length > 0) {
            tS[tS.length] = recursiveParse(f);
        }
    }
    return fI;
}
trace(s);

すばらしい回答をありがとうございます。上記のコードはまったく気にしないことに注意してください。あなたの答えが、コードに対する単純な 3 行の修正、または私の作業を無視した独自の 33 行のコードである場合は、それで問題ありません。入力が出力に変わる限り。

更新: さて、stackoverflow が山かっこを隠していることに気付きました。それを直さなきゃ。更新: 山かっこが修正されました。

4

1 に答える 1

6

まあ、再帰を使う必要はありません。まず、複雑さの降順で文字列を検索する配列を確認します。

var kw:Array = ["panda tea cup","tea cup","panda","tea"];

つまり、文字列 A に文字列 B が含まれる場合、A が最初に来る必要があります。次に、この正規表現を使用できます。/(panda tea cups|tea cups|tea|panda)/iまたは、あなたの場合は次のようにします。

var p:RegExp = new RegExp("("+kw.join("|")+")","gi");

そして、今と同じように、一致を に置き換え<$&>ます。

この正規表現の動作はこちらで確認できます。

于 2012-09-11T16:16:10.667 に答える