Oli*_*and 3 regex recursion parsing actionscript-3
好吧,这个头衔是一个吸引注意力的人.我承认这一点.现在来问题了!
概述我在项目中有一些代码,我正在使用HTML标签标记文本(对于Flash wiki).我已经创建了一个独立的文件,我将在这个问题上重点关注,以使事情更加清晰.
我想做什么我的输入是一个关键字列表和一个文本块.在这种情况下,输入是
["panda","tea","tea cup","panda tea cup"];
Run Code Online (Sandbox Code Playgroud)
和
"Tea is good. I like tea cups, too. Pandas also like tea but need special panda tea cups to drink it.";
Run Code Online (Sandbox Code Playgroud)
预期的输出应该是这样的:
"<Tea> is good. I like <tea cups>, too. <Panda>s also like <tea> but need special <panda tea cups> to drink it.
Run Code Online (Sandbox Code Playgroud)
问题我认为我可以用一个简单的replace()函数来做到这一点,但很快意识到我最终会得到这个:
"<Tea> is good. I like <<tea> cups>, too. <Panda>s also like <tea> but need special <<panda> <<tea> cups>> to drink it."
Run Code Online (Sandbox Code Playgroud)
我不想要的.
我最终决定构建一个递归函数,从最长的关键字开始打破代码,然后逐渐减少到最小的关键字.虽然现在我完全糊涂了并且继续得到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);
Run Code Online (Sandbox Code Playgroud)
提前感谢您的出色答案!请记住,我在任何程度上都不关心上面的代码.如果你的答案是一个简单的三行修复代码或你自己的三十三行代码无视我的工作,我很好.只要输入变为输出.
更新:好的,我现在意识到stackoverflow隐藏了我的尖括号.要解决这个问题.更新:固定角括号.
好吧,你不需要使用递归.首先,确保您的数组按复杂度递减的顺序搜索字符串:
var kw:Array = ["panda tea cup","tea cup","panda","tea"];
Run Code Online (Sandbox Code Playgroud)
也就是说,如果字符串A包含字符串B,那么A必须首先出现.然后,您可以使用此正则表达式:/(panda tea cups|tea cups|tea|panda)/i或者,在您的情况下,执行:
var p:RegExp = new RegExp("("+kw.join("|")+")","gi");
Run Code Online (Sandbox Code Playgroud)
并<$&>像现在一样替换匹配.
你可以在这里看到这个正则表达式.