JavaScript 关键字快速匹配
来源:
http://www.cnblogs.com/index-html/archive/2013/04/17/js_keyword_match.html
http://www.etherdream.com/funnyscript/Keyword/Keyword.html
适用于多关键字、大文本匹配,若关键字只有一个,则只是最朴素的字符串匹配(逐个匹配),没显示作用。
var treeSearch = {
makeTree: function(strKeys) {
"use strict";
var tblCur = {},
tblRoot,
key,
str_key,
Length,
j,
i
;
tblRoot = tblCur;
for ( j = strKeys.length - 1; j >= 0; j -= 1) {
str_key = strKeys[j];
Length = str_key.length;
for ( i = 0; i < Length; i += 1) {
key = str_key.charAt(i);
if (tblCur.hasOwnProperty(key)) { //生成子节点
tblCur = tblCur[key];
} else {
tblCur = tblCur[key] = {};
}
}
tblCur.end = true; //最后一个关键字没有分割符
tblCur = tblRoot;
}
return tblRoot;
},
search: function(content, tblRoot) {
"use strict";
var tblCur,
p_star = 0,
n = content.length,
p_end,
match, //是否找到匹配
match_key,
match_str,
arrMatch = [], //存储结果
arrLength = 0 //arrMatch的长度索引
;
while (p_star < n) {
tblCur = tblRoot; //回溯至根部
p_end = p_star;
match_str = "";
match = false;
do {
match_key = content.charAt(p_end);
if (!(tblCur = tblCur[match_key])) { //本次匹配结束
p_star += 1;
break;
}else{
match_str += match_key;
}
p_end += 1;
if (tblCur.end === true) //是否匹配到尾部 //找到匹配关键字
{
match = true;
}
} while (true);
if (match === true) { //最大匹配
arrMatch[arrLength] = { //增强可读性
key: match_str,
begin: p_star - 1,
end: p_end
};
arrLength += 1;
p_star = p_end;
}
}
return arrMatch;
}
};
function test(strContent, strKeys) {
var arrMatch,
tblRoot = treeSearch.makeTree(strKeys),
t = new Date();
arrMatch = treeSearch.search(strContent, tblRoot);
console.log("time is: " + (new Date() - t) + "mm");
console.log(arrMatch);
}
var s = (function() {
var Things = [' ', '\n', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
var s = "";
for (var i = 1000000; i >= 0; i--) {
s += Things[parseInt(Math.random() * Things.length) % Things.length]
};
return s;
})()
test(s, ["abc", "efge", "fun", "tree"]);
JavaScript 关键字快速匹配的更多相关文章
- sizzle源码分析 (3)sizzle 不能快速匹配时 选择器流程
如果快速匹配不成功,则会进入sizzle自己的解析顺序,主要流程如下: 总结流程如下: (1)函数sizzle是sizzle的入口,如果能querySelectAll快速匹配,则返回结果 (2)函数S ...
- MySQL的JOIN(四):JOIN优化实践之快速匹配
这篇博文讲述如何优化扫描速度.我们通过MySQL的JOIN(二):JOIN原理得知了两张表的JOIN操作就是不断从驱动表中取出记录,然后查找出被驱动表中与之匹配的记录并连接.这个过程的实质就是查询操作 ...
- JavaScript 关键字
JavaScript 关键字 和其他任何编程语言一样,JavaScript 保留了一些关键字为自己所用. JavaScript 同样保留了一些关键字,这些关键字在当前的语言版本中并没有使用,但在以后 ...
- sublime快捷键:快速查找函数和快速匹配括号
1. 快速查找函数 Ctrl+R 2. 快速匹配括号 光标置于括号中,Ctrl+Shift+M 快速匹配括号内容,再按下 Ctrl+Shift+[ 折叠代码, Ctrl+Shift+] 展开代码. 3 ...
- JavaScript关键字
JavaScript关键字 制作人:全心全意 abstract continue finally instanceof private this boolean default float int p ...
- 【JS】303- 编写更好的 JavaScript 条件式和匹配条件的技巧
译者:@chorer 译文:https://chorer.github.io/2019/06/24/Trs-更好的JavaScript条件式和匹配标准技巧/作者:@Milos Protic原文:htt ...
- MYSQL join 优化 --JOIN优化实践之快速匹配
MySQL的JOIN(四):JOIN优化实践之快速匹配 优化原则:小表驱动大表,被驱动表建立索引有效,驱动表建立索引基本无效果.A left join B :A是驱动表,B是被驱动表:A right ...
- Excel如何通过关键字模糊匹配查找全称
打开excel,以其素材为例,通过关键字模糊匹配查找全称. 在公司名下输入公式:=LOOKUP(1,0/FIND(D2,A2:A5),A2:A5),按回车键确定即可. FIND(D2,A2:A ...
- JavaScript关键字之super()
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/super The super keyword ...
随机推荐
- C 标准库IO缓冲区和内核缓冲区的区别
1.C标准库的I/O缓冲区 UNIX的传统 是Everything is a file,键盘.显示器.串口.磁盘等设备在/dev 目录下都有一个特殊的设备文件与之对应,这些设备文件也 ...
- js 去掉前后空格
前后去空格 return str.replace(/(^\s*)|(\s*$)/g, ""); 全部去空格 $("#panelbody").text().rep ...
- ubuntu常用的一些命令
1 添加root用户 其实ubuntu在安装时已经添加了root用户,只是屏蔽了.所以只需要激活即可.打开终端ctrl+alt+t,输入sudo passwd root,然后输入要添加给root的密码 ...
- MATLAB(3)——GUI界面设计入门
作者:桂. 时间:2017-03-01 18:43:35 链接:http://www.cnblogs.com/xingshansi/articles/6485688.html 声明:转载请注明出处, ...
- CentOS7添加开机启动服务/脚本(延用CentOS6方法)
一.添加开机自启服务 在centos7中添加开机自启服务非常方便,只需要两条命令(以Jenkins为例): systemctl enable jenkins.service #设置jenkins服务为 ...
- Windows环境下文件的彻底删除与恢复,推荐几个工具(整理)
1. 背景 在Windows(从XP到Win7)中删除文件时,无论是Delete或者是Shift+Delete,都不能真正的删除文件,它做的事情只是从文件分配表中删除了该文件的信息,而并未将文件从存储 ...
- 如何用adb抓取log?
在Androidclient的測试过程中,有时候我们会遇到闪退等异常情况. 这时我们能够通过adb抓取log.从而给开发提供很多其它信息. 一.下载ADB.exe 在网上搜索"adb ...
- "DISTINCT" make huge difference
继上一篇提到的UNION/UNION ALL会影响执行计划,再次碰到一个类似的问题.一个SQL加了DISTINCT跟不加DISTINCT的执行计划完全不同,导致执行时间差了好多倍. 原始的SQL如下所 ...
- python定制类详解
1.什么是定制类python中包含很多内置的(Built-in)函数,异常,对象.分别有不同的作用,我们可以重写这些功能. 2.__str__输出对象 class Language(object): ...
- Spark history Server配置实用
Spark history Server产生背景 以standalone运行模式为例,在运行Spark Application的时候,Spark会提供一个WEBUI列出应用程序的运行时信息:但该WEB ...