JavaScript实战笔记(三) 文本搜索

简介: JavaScript实战笔记(三) 文本搜索

借鉴 pdf.js 源码,实现文本搜索功能,包含大小写敏感和全字匹配选项,话不多说,直接上码

var CharacterType = {
    SPACE: 0,
    ALPHA_LETTER: 1,
    PUNCT: 2,
    HAN_LETTER: 3,
    KATAKANA_LETTER: 4,
    HIRAGANA_LETTER: 5,
    HALFWIDTH_KATAKANA_LETTER: 6,
    THAI_LETTER: 7
}
function isAlphabeticalScript(charCode) { return charCode < 0x2E80 }
function isAscii(charCode) { return (charCode & 0xFF80) === 0 }
function isAsciiAlpha(charCode) { return charCode >= 0x61 && charCode <= 0x7A || charCode >= 0x41 && charCode <= 0x5A }
function isAsciiDigit(charCode) { return charCode >= 0x30 && charCode <= 0x39 }
function isAsciiSpace(charCode) { return charCode === 0x20 || charCode === 0x09 || charCode === 0x0D || charCode === 0x0A }
function isThai(charCode) { return (charCode & 0xFF80) === 0x0E00 }
function isHan(charCode) { return charCode >= 0x3400 && charCode <= 0x9FFF || charCode >= 0xF900 && charCode <= 0xFAFF }
function isKatakana(charCode) { return charCode >= 0x30A0 && charCode <= 0x30FF }
function isHiragana(charCode) { return charCode >= 0x3040 && charCode <= 0x309F }
function isHalfwidthKatakana(charCode) { return charCode >= 0xFF60 && charCode <= 0xFF9F }
function getCharacterType(charCode) {
    if (isAlphabeticalScript(charCode)) {
        if (isAscii(charCode)) {
            if (isAsciiSpace(charCode)) { return CharacterType.SPACE }
            else if (isAsciiAlpha(charCode) || isAsciiDigit(charCode) || charCode === 0x5F) { return CharacterType.ALPHA_LETTER }
            return CharacterType.PUNCT
        }
        else if (isThai(charCode)) { return CharacterType.THAI_LETTER }
        else if (charCode === 0xA0) { return CharacterType.SPACE }
        return CharacterType.ALPHA_LETTER
    }
    if (isHan(charCode)) { return CharacterType.HAN_LETTER }
    else if (isKatakana(charCode)) { return CharacterType.KATAKANA_LETTER }
    else if (isHiragana(charCode)) { return CharacterType.HIRAGANA_LETTER }
    else if (isHalfwidthKatakana(charCode)) { return CharacterType.HALFWIDTH_KATAKANA_LETTER }
    return CharacterType.ALPHA_LETTER
}
function isEntireWord(content, matchIdx, length) {
    var startIdx = matchIdx
    if (startIdx > 0) {
        var first = content.charCodeAt(startIdx)
        var limit = content.charCodeAt(startIdx - 1)
        if (getCharacterType(first) === getCharacterType(limit)) {
            return false
        }
    }
    var endIdx = matchIdx + length - 1
    if (endIdx < content.length - 1) {
        var last = content.charCodeAt(endIdx)
        var limit = content.charCodeAt(endIdx + 1)
        if (getCharacterType(last) === getCharacterType(limit)) {
            return false
        }
    }
    return true
}
/**
 * 在特定文本中搜索指定内容,返回结果索引
 * @param  {String}   query         要查询的内容
 * @param  {String}   content       待搜索的文本
 * @param  {Boolean}  caseSensitive 大小写敏感
 * @param  {Boolean}  entireWord    全字匹配
 * @return {[Number]}               结果索引
 */
function search(query, content, caseSensitive, entireWord) {
    if (query.length === 0) {
        return
    }
    if (!caseSensitive) {
        query = query.toLowerCase()
        content = content.toLowerCase()
    }
    var matchRst = [], matchIdx = -query.length, queryLen = query.length
    while (true) {
        matchIdx = content.indexOf(query, matchIdx + queryLen)
        if (matchIdx === -1) {
            break
        }
        if (entireWord && !isEntireWord(content, matchIdx, queryLen)) {
            continue
        }
        matchRst.push(matchIdx)
    }
    return matchRst
}


一个用于测试的例子

var content = 'Say Hello To Tomorrow. Say Goodbye To Yesterday.'
var query = 'say'
var result = search(query, content, true, false)
console.log(result) // []
var result = search(query, content, false, false)
console.log(result) // [0, 23]
var query = 'Good'
var result = search(query, content, true, false)
console.log(result) // [27]
var result = search(query, content, true, true)
console.log(result) // []


目录
相关文章
|
1月前
|
JavaScript
Nest.js 实战 (十一):配置热重载 HMR 给服务提提速
这篇文章介绍了Nest.js服务在应用程序引导过程中,TypeScript编译对效率的影响,以及如何通过使用webpackHMR来降低应用实例化的时间。文章包含具体教程,指导读者如何在项目中安装依赖包,并在根目录下新增webpack配置文件webpack-hmr.config.js来调整HMR相关的配置。最后,文章总结了如何通过自定义webpack配置来更好地控制HMR行为。
|
7天前
|
JavaScript 前端开发 Java
JavaScript笔记(回顾一,基础知识篇)
JavaScript基础知识点回顾,包括语言定义、ECMAScript规范、字面量、变量声明、操作符、关键字、注释、流程控制语句、数据类型、类型转换和引用数据类型等。
JavaScript笔记(回顾一,基础知识篇)
|
23天前
Nest.js 实战 (十三):实现 SSE 服务端主动向客户端推送消息
这篇文章介绍了在Nest.js应用中使用Server-Sent Events (SSE)的技术。文章首先讨论了在特定业务场景下,为何选择SSE而不是WebSocket作为实时通信系统的实现方式。接着解释了SSE的概念,并展示了如何在Nest.js中实现SSE。文章包含客户端实现的代码示例,并以一个效果演示结束,总结SSE在Nest.js中的应用。
Nest.js 实战 (十三):实现 SSE 服务端主动向客户端推送消息
|
11天前
|
JavaScript 前端开发 安全
js逆向实战之烯牛数据请求参数加密和返回数据解密
【9月更文挑战第20天】在JavaScript逆向工程中,处理烯牛数据的请求参数加密和返回数据解密颇具挑战。本文详细分析了这一过程,包括网络请求监测、代码分析、加密算法推测及解密逻辑研究,并提供了实战步骤,如确定加密入口点、逆向分析算法及模拟加密解密过程。此外,还强调了法律合规性和安全性的重要性,帮助读者合法且安全地进行逆向工程。
50 11
|
2月前
|
SQL 运维 监控
Nest.js 实战 (十):使用 winston 打印和收集日志记录
这篇文章介绍了在Nest服务中如何使用Winston记录日志。文章首先强调了日志记录在后台服务中的重要性,接着提到Nest默认的内部日志记录器,并指出可以通过@nestjs/common包中的Logger类来全面控制日志系统的行为。文章还提到,为了在生产环境中实现更高级的日志功能,可以使用如Winston之类的Node.js日志包。接下来,文章介绍了如何在Nest服务中使用Winston记录日志,包括安装相关依赖、创建winston配置文件以及实现简单的日志记录示例。最后,文章指出更高级的自定义日志功能需要读者自己去探索。
Nest.js 实战 (十):使用 winston 打印和收集日志记录
|
24天前
Nest.js 实战 (十二):优雅地使用事件发布/订阅模块 Event Emitter
这篇文章介绍了在Nest.js构建应用时,如何通过事件/发布-订阅模式使应用程序更健壮、灵活、易于扩展,并简化服务间通信。文章主要围绕@nestjs/event-emitter模块展开,这是一个基于eventemitter2库的社区模块,提供了事件发布/订阅功能,使得实现事件驱动架构变得简单。文章还介绍了如何使用该模块,包括安装依赖、初始化模块、注册EventEmitterModule、使用装饰器简化监听等。最后总结,集成@nestjs/event-emitter模块可以提升应用程序的事件驱动能力,构建出更为松耦合、易扩展且高度灵活的系统架构,是构建现代、响应迅速且具有高度解耦特性的Nest.
|
2月前
|
JavaScript 数据安全/隐私保护 Python
网易云音乐搜索接口JS逆向: Params、encSecKey加密和AES实战
网易云音乐搜索接口JS逆向: Params、encSecKey加密和AES实战
46 4
|
2月前
|
前端开发 JavaScript 开发者
前端JS按钮点击事件、跳出弹窗、遮罩的实战示例
本文提供了一个前端JS按钮点击事件、弹出式窗口和遮罩层的实战示例,包括HTML、CSS和JavaScript的具体实现代码,以及功能解析,演示了如何实现按钮点击后触发弹窗显示和遮罩层,并在2秒后自动关闭或点击遮罩层关闭弹窗的效果。
前端JS按钮点击事件、跳出弹窗、遮罩的实战示例
|
2月前
|
JavaScript 前端开发 安全
JS 混淆解析:JS 压缩混淆原理、OB 混淆特性、OB 混淆JS、混淆突破实战
JS 混淆解析:JS 压缩混淆原理、OB 混淆特性、OB 混淆JS、混淆突破实战
46 2
|
2月前
|
JavaScript 前端开发
JavaScript基础&实战 JS中正则表达式的使用
这篇文章介绍了JavaScript中正则表达式的使用,包括正则表达式的创建、匹配模式、字符串匹配、拆分、搜索、匹配和替换等方法,并通过示例代码展示了如何应用这些技术。
JavaScript基础&实战 JS中正则表达式的使用
下一篇
无影云桌面