参考链接:

https://zhuanlan.zhihu.com/p/84685657

https://www.cnblogs.com/luguoshuai/p/9254190.html

一开始打算使用树结构来实现,但考虑到敏感字数量过多,其构建的树会十分庞大,占用过多内存,所以这里使用的是上面链接里面提到的“滑动窗口”方法

例如,要检测的字符串为“123”,则实际上只需处理,以下6种情况:1,12,123,2,23,3;进行6次敏感字的判断即可

 1 local sensitiveWordList = {
2 "早啊",
3 "a啊",
4 } --测试用
5 local sensitiveWordDic = {} --key:敏感字 value:true
6
7 --获取字符数
8 function GetWordCount(str)
9 local _,count = string.gsub(str, "[^\128-\193]", "")
10 return count
11 end
12
13 --将字符串转为table
14 function GetWordTable(str)
15 local temp = {}
16 for uchar in string.gmatch(str, "[%z\1-\127\194-\244][\128-\191]*") do
17 temp[#temp+1] = uchar
18 end
19 return temp
20 end
21
22 --将字符串的table转为字符串
23 function GetWordStr(wordTable, startPos, endPos)
24 local str = ""
25 local startPos = startPos or 1
26 local endPos = endPos or #wordTable
27 for i=startPos,endPos do
28 str = str .. wordTable[i]
29 end
30 return str
31 end
32
33 --处理敏感字
34 --isOnlyCheck:true表示仅检查是否有敏感字
35 function HandleSensitiveWord(str, isOnlyCheck)
36 local wordTable = GetWordTable(str)
37 local recordPos = {} --记录敏感字的位置
38 local hasSensitiveWord = false --是否有敏感字
39 local resultStr
40
41 for i=1,#wordTable do --开始位置
42 for j=i,#wordTable do --结束位置
43 local strTemp = GetWordStr(wordTable, i, j)
44 print(strTemp)
45 if sensitiveWordDic[strTemp] then
46 hasSensitiveWord = true
47 table.insert(recordPos, {i, j})
48 i = j
49 break
50 end
51 end
52
53 if hasSensitiveWord and isOnlyCheck then
54 break
55 end
56 end
57
58 if isOnlyCheck then
59 return hasSensitiveWord
60 else
61 for i=1,#recordPos do
62 local startPos = recordPos[i][1]
63 local endPos = recordPos[i][2]
64 for j=startPos,endPos do
65 wordTable[j] = "*"
66 end
67 end
68 resultStr = GetWordStr(wordTable)
69 return hasSensitiveWord, resultStr
70 end
71 end
72
73 function Init()
74 for i=1,#sensitiveWordList do
75 sensitiveWordDic[sensitiveWordList[i]] = true
76 end
77
78 --测试
79 local hasSensitiveWord, resultStr = HandleSensitiveWord("a早啊s")
80 print(hasSensitiveWord, resultStr)
81 end
82
83 Init()

结果如下:

[Lua]敏感字检测的更多相关文章

  1. php 检测敏感字

    public function getMin($content){//调用接口 $content_url ="http://www.ju1.cn/index.php/Index/add.ht ...

  2. Python中替换敏感字

    敏感词在文本文件document.txt中,当用户输入敏感词语时,用*号代替并打印出来 document.txt中的文件内容如下: 北京 上海 广州 深圳 领导 test.py content=inp ...

  3. [DeeplearningAI笔记]序列模型3.9-3.10语音辨识/CTC损失函数/触发字检测

    5.3序列模型与注意力机制 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.9语音辨识 Speech recognition 问题描述 对于音频片段(audio clip)x ,y生成文本 ...

  4. 敏感词检测、屏蔽设计(iOS & Android)

    敏感词检测 服务器端最常使用的算法是DFA算法.如果服务器端使用java实现常规的DFA算法,假若... 源码:https://github.com/qiyer/DFA_Cplusplus

  5. C++ 简单中文敏感词检测工具类

    具体思路: 1->敏感词库,可从数据库读取,也可以从文件加载. 2->将敏感词转化为gbk编码,因为gbk严格按照字符一个字节,汉字两个字节的格式编码,便于容易切分文字段. 3->将 ...

  6. lua敏感词过滤

    --过滤敏感词(如果onlyKnowHas为true,表示只想知道是否存在敏感词,不会返回过滤后的敏感词,比如用户注册的时候,我们程序是只想知道用户取的姓名是否包含敏感词的(这样也能提高效率,检测到有 ...

  7. [lua][openresty]代码覆盖率检测的解决方式

    废话在前 什么是代码覆盖率 来自百度百科 代码覆盖(Code coverage)是软件测试中的一种度量,描述程式中源代码被测试的比例和程度,所得比例称为代码覆盖率. 开发人员为何关注? 在我们的开发过 ...

  8. python (5分钟实现一个游戏的屏蔽敏感字系统,)

    import datetime time=datetime.datetime.now() dirty= ['fuck','狗日的','犊子','麻批','仙人板板','R你妈','操你','草你',' ...

  9. 简单使用jstl实现敏感字替换

    package com.ceshi; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; ...

  10. 一篇搞定Java过滤器

    Filter:过滤器 引言 我们可以通过使用前面的技术,做出一些简单的登陆注册以及配合数据库实现对数据增删改查的Demo,程序是基本运行起来了,但是却存在着一个重大的安全问题,那就登陆权限验证,一般来 ...

随机推荐

  1. centos6.x配置虚拟主机名及域名hosts

    我们在本地安装了centos或者虚拟主机上安装了centos,主机名称默认是localhost,这样我们可以使用localhost访问我们的主机,在终端命令里默认的是[root@localhost ~ ...

  2. Oracle ASM磁盘组的常用操作

    1.查看现有磁盘组信息 select group_number gno,name,state,type,total_mb,free_mb,required_mirror_free_mb rmfmb,u ...

  3. golang基本数据类型

    1.整形 默认整数类型为int 变量在选择时应遵循最小化原则 1.1 有符号(int) 类型 取值范围 占用空间(字节) int8 -2^7到 2^7-1 (-128到127) 1 int16 -2^ ...

  4. 请求/响应拦截器 给请求添加token认证

  5. Java使用HSSFWorkbook生成Excel

    HSSF 是Horrible SpreadSheet Format的缩写,也即"讨厌的电子表格格式". 也许HSSF的名字有点滑稽,就本质而言它是一个非常严肃.正规的API.通过H ...

  6. 第六章 mysql日志

    第六章 mysql日志 一 错误日志 错误日志的默认存放路径是 mysql 存放数据的地方  hostname.err 1. 修改错误日志存放路径 [mysqld] log-error=/data/m ...

  7. Kubernetes--Ingress资源类型

    Ingress资源类型 基于HTTP暴露的每个Service资源均可发布于一个独立的FQDN主机名之上,如 " www.ik8s.io " :也可发布于某主机上的URL路径之上,从 ...

  8. 摘抄笔记 centos内核优化

  9. 教你三分钟开发开发java短信验证码

    现如今,绝大多数网站和app都需要支持手机号注册.手机登录,这就需要开发者实现短信验证码的功能,对于很多小白同学来说,没接触过,没有思路,下面小编就给大家详解一下. 发送短信的功能需要借助第三方的短信 ...

  10. Linux 使用vsftpd服务传输文件

    文件传输协议 FTP是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用20.21号端口,其中端口20(数据端口)用于进行数据传输,端口21(命令端口)用于接受客户端发出的相关FTP命 ...