过滤

C++ 0x regex实现关键OR敏感字过滤

孤街醉人 提交于 2020-04-24 06:53:30
给出一篇文档,要求把里面的“性爱”都替换成“革命”,“性”都替换成“道德”。删除里面所有的“A片”。在所有的“苍井空来了”前面加上“(表相信)”,后面加上“(这是谣言)”。 要求:考虑周密,设想各种会出现的奇怪情况。因为---我们是国家安全局!宁可错杀一万,不能漏过一个。 首先考虑到肯定要涉及到各种宽字符的过滤故肯定要使用unicode来处理,我们的函数接口不妨设为 static void filter_unicode(std::wstring& ws_text); 然后题目中的三个需求其实都可以概括成将子串A替换为B的操作,故如果没有特殊要求直接三句boost::replace_all即可搞定。 现在来考虑最后的要求中提到的“奇怪情况”,那就需要我们“设身处地”地来思考啦。我们平时想输入敏感字时会用到什么方法呢,无外乎会插入空格或者各种异常标点符号之类,这里会想到用正则表达式岂不正好?符合我们需求的相应函数为std::regex_replace,boost的regex库也有对应函数,这里就用c++ 0x原生的了。 我们的需求是从关键字首字符开始匹配,中间如果只间隔标点符号,且符号结束后的第一个字符与关键字尾字符相匹配,则匹配成功,将此串替换为预设的目标串。要注意到的是c++ 0x和boost中的regex库并不支持unicode库定义,比如 \p{L} 之类的定义

GMF之Shapes实例Part7:过滤右击菜单

你。 提交于 2019-12-10 17:53:15
前边有至少两篇文章讲了添加右击菜单,一种是算是纯粹的用代码添加,另外一种是借助扩展点。借助扩展点的方法虽然比较简单,但是不够灵活,比如你想让某一菜单项在满足一定条件时才显示,或者想构造动态的菜单,那么就必须使用代码添加的方法了,并在构造菜单时做一个判断,满足条件才把这个菜单加上去。 现在看看我们的菜单,会发现总是有一些系统默认项,看上去不大清爽,如下图: 其实到现在只有两个菜单项是我们想要的:Delete From Model以及Change Image,其他的显示在那显得很多余,也很不美观。 GMF中菜单项的管理是在DiagramEditorContextMenuProvider类,我们在这个类中添加以下代码: // 过滤不需要的上下文菜单 public IContributionItem[] getItems() { IContributionItem[] items = super.getItems(); filterSystemPopMenu(items); return items; } 这个方法先获得所有的右击菜单项,然后使用filterSystemPopMenu(items);方法过滤菜单之后返回过滤之后的菜单项。 filterSystemPopMenu(items);代码如下: // 过滤菜单项 void filterSystemPopMenu

编程珠玑

倾然丶 夕夏残阳落幕 提交于 2019-12-10 06:22:23
如果发布内容不存在敏感词第一个字集合情况下,test2做出了很大优化,循环次数为发布内容个数。 但是如果发布内容村子敏感词,还是使用了test1方法,问题还存在。 怎样脱离test1方法?我们可以考虑把敏感词进一步分析,第二个字集合也进行规整、第三个字集合、第四个...。 这个让我想到了树形结构: 办 气 裸 土 证 枪 聊 表 枪 出 演 卖 售 每一层进行规整,但是不同的层可能出现相同的字,怎么区分他们? 我们进行从根到层的一个map拓展,这样可以区分不同的分支。 简单说,就是第二层有两个“枪”,但是第一个属于“气”父亲,第二个属于“土”父亲,我们根据“气枪”找到它下面的集合“出”,根据“土枪”找到集合“卖”。 package test; import static util.PrintUtil.print; import java.util.ArrayList; import java.util.HashMap; public class Test { static String[] keys = {"办证", "气枪出售", "裸聊", "裸表演", "土枪卖"}; static String tContent = "再办证顶"; static ArrayList<String> first = new ArrayList<String>(); static HashMap

编程珠玑

六月ゝ 毕业季﹏ 提交于 2019-12-10 06:17:27
在第四步中,我们看到,使用排序好的String[] 要比 ArrayList<String> 查找时候快速的多,因为ArrayList<String>的查找复杂度O(n),而排序好的String[]查找复杂度O(1)。 但是我们还是过量依赖String,这个对象本身效率就不高,于是我们需要换成更底层的原始类型进行优化: package test; import static util.PrintUtil.print; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; public class Test { static String[] keys = {"办证", "气枪出售", "裸聊", "裸表演", "土枪卖"}; static String tContent = "再办证顶"; static ArrayList<String> first = new ArrayList<String>(); static String[] sortFirst; static char[] charFirst; static

编程珠玑

て烟熏妆下的殇ゞ 提交于 2019-12-10 06:01:27
就像上一步说的那样, 当敏感词超过了一定量时候,效率将会急剧下降 。 假设发布内容“再顶”,敏感词达到了1000个,按照快速实现的方法,循环1000次,显然不是最优方法。 因为“再”,“顶”并没有出现在 "办证、 气枪、 裸聊" 的第一个字集合"办、气、裸"中,所以我们可以考虑当搜集所有敏感词第一个字集合来快速判断发布内容是否含有敏感词。 package test; import static util.PrintUtil.print; import java.util.ArrayList; public class Test { static String[] keys = {"办证", "气枪", "裸聊"}; static String tContent = "再顶"; static ArrayList<String> list = new ArrayList<String>(); static { for (String k : keys) { if (!list.contains(k.substring(0, 1))) { list.add(k.substring(0, 1)); } } } /** * 快速实现的方法 */ public final static String test1(String content) { for (String k : keys) {

编程珠玑

好久不见. 提交于 2019-12-07 15:32:29
第五步已经完成了所有工作,但是新的需求来了,就是发布广告的人有一些特殊字符来绕过敏感词判断,我们需要把特殊字符过滤掉,那么正常想法就是使用正则表达式来过滤,但是我们实现的这个算法中,可以把特殊字符判断消化在其中: package test; import static util.PrintUtil.print; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; public class Test { static int key_max = 0; // 敏感词最大长度 static String[] keys = {"办证", "气枪出售", "裸聊", "裸表演", "土枪卖"}; static String tContent = "再办证顶"; static ArrayList<String> first = new ArrayList<String>(); static String[] sortFirst; static char[] charFirst; static HashMap<String,

编程珠玑

…衆ロ難τιáo~ 提交于 2019-12-07 15:32:16
到第三步,已经把算法优化的精髓掌握了,用树形结构来承载。 但是有些细节不容忽视,我们大量使用了ArrayList.contains,效率非常不高。 这里进行进一步优化,就是“疯狂的排序、疯狂的二分查找”。 package test; import static util.PrintUtil.print; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; public class Test { static String[] keys = {"办证", "气枪出售", "裸聊", "裸表演", "土枪卖"}; static String tContent = "再办证顶"; static ArrayList<String> first = new ArrayList<String>(); static String[] sortFirst; static HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();

编程珠玑

萝らか妹 提交于 2019-12-07 15:32:01
厚着脸皮,使用“编程珠玑”。 需求: 判断出发布内容是否含有敏感词。 敏感词:办证、气枪、裸聊 发布内容:***************** 第一步:快速实现 实现主要功能,没有什么特别地方。但是有个很重要问题, 当敏感词超过了一定量时候,效率将会急剧下降 。 因为不管发布内容多少,每次需要循环敏感词个数,假设发布内容“顶”,敏感词达到了1000个,循环1000次,将明显消耗性能。 package test; import static util.PrintUtil.*; public class Test { static String[] keys = {"办证", "气枪", "裸聊"}; static String tContent = "测试内办证容"; /** * 快速实现的方法 */ public final static String test1(String content) { for (String k : keys) { if (content.indexOf(k) > -1) return k; } return null; } public static void main(String[] args) { long time1 = System.currentTimeMillis(); print(test1(tContent)); print(

编程珠玑

独自空忆成欢 提交于 2019-12-07 01:41:01
到了第六步,我们只是理论上探讨优化的步骤,最后,我们进行集体测试,使用敏感词越多,效果越明显: package test; import static util.PrintUtil.print; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; public class Test { static int key_max = 0; // 敏感词最大长度 static String[] keys = {"办证", "气枪出售", "裸聊", "裸表演", "土枪卖"}; static String tContent = "再办证顶"; static ArrayList<String> first = new ArrayList<String>(); static String[] sortFirst; static char[] charFirst;

学习 yii 框架 – 使用简单的动作过滤器

半城伤御伤魂 提交于 2019-12-01 06:11:15
这里我讲一下在yii框架中如何使用简单的过滤器(filter). yii 框架 提供了很好的动作(action)过滤,使用的方法也很简单,例如: 只有通过 POST 请求才能访问 post/delete 页面,只需在控制器的 filters 方法中添加如下内容 public function filters(){ return array( 'postOnly + delete' ); } 这里的 postOnly 是 yii 内置的过滤器,还有 ajaxOnly (只允许 ajax 请求) 也是内置的过滤器. 如果需要过滤多个动作只需将多个控制器的名字使用逗号(,)分隔,然后放到加号(+)后面,如下: public function filters(){ return array( 'postOnly + delete,submit...' ); } 上面说了怎么使用内置的过滤器,那么怎么来定制简单的过滤器呢,方法很简单 假如我们在开发 Restful Api 时会用到 PUT 请求,在服务端就需要过滤只有是 PUT 请求才可以访问到 update 控制器(举例说明),那我们就需要定义一个过滤 PUT 请求的过滤器 putOnly,定义的方法为:在控制器(Controller)中创建方法(function) filterPutOnly,方法的内容如下: public