toolgood / ToolGood.Words

一款高性能敏感词(非法词/脏字)检测过滤组件,附带繁体简体互换,支持全角半角互换,汉字转拼音,模糊搜索等功能。

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

发现一个匹配bug

lantongxue opened this issue · comments

第一个问题是匹配位置的问题:
WordsSearch.cs FindAll 方法中
list.Add(new WordsSearchResult(keyword, i + 1 - keyword.Length, i, item));
这样计算出来的位置有很大偏差
经过我仔细计算后,应该是这样的

int start = i + 1 - keyword.Length;
list.Add(new WordsSearchResult(keyword, start, start + keyword.Length, item));

其中 FindFirst 也是一样的问题。

第二个问题还是匹配位置的问题:
如果匹配的内容中有 \r、\n 这类的字符,那么实际计算出来的位置要减去这类字符的数量

比如我有如下测试文本:

庭审中,邱吉林承认了曾同小小发生性关系,但否认知道小小的年龄,其辩护人为他做了轻罪辩护。
12月16日,备受关注的成都市双流区14岁未成年女生小小(化名)遭遇强奸后跳楼事件在双流区人民法院开庭审理。双流区人民检察院指控,2019年8月至12月期间,被告人邱吉林在明知小小不满14周岁的情况下,采取金钱利诱、威胁等手段,与其相继发生8次性关系,期间还两次拍摄性侵视频并传播。检方认为,被告人邱吉林多次奸淫不满十四周岁的幼女,并造成被害人怀孕等后果,情节特别恶劣,罪行极其严重,应当以强奸罪追究其刑事责任。
上游新闻记者了解到,被告人邱吉林当庭承认了自己曾与小小发生过性关系,但否认知道其具体年龄,代理律师为他做了轻罪辩护。
被害人小小的母亲表示,不接受邱吉林的任何道歉与赔偿,希望法院能够对其重判。
取保候审期间,邱吉林发布的出行照片。图片来源 / 网页截图
此前,上游新闻刊发的《成都14岁女生被强奸引产后自杀,涉案企业老板取保候审后疑似西藏旅游》《成都少女被强奸后自杀 媒体报道3天后嫌犯被批捕》报道显示,小小的母亲朱琴华表示,女儿生前曾遭企业老板邱吉林的伤害:邱吉林先通过利诱小小发送裸照,再利用裸照胁迫小小发生关系并导致小小怀孕。2月3日,小小发现自己怀孕,到医院检查后发现已怀孕15周。2月4日,成都市公安局双流区分局就小小被强奸一案正式立案侦查,邱吉林被取保候审。成都市公安局双流区分局5月8日作出的鉴定意见书显示,“邱吉林是小小引产胎儿的生物学父亲”。
6月28日晚,小小在位于双流区的家中结束了自己的生命。
今年7月2日,媒体广泛报道了小小的遭遇后,双流警方将已经取保候审近5个月的邱吉林刑事拘留,7月16日邱吉林被逮捕,10月30日检方移送法院起诉。
双流区人民检察院指控,2019年8月20日,邱吉林与被害人小小相互添加为QQ好友并进行聊天。2019年8月至12月期间,邱吉林林在明知小小不满14周岁的情况下,采取金钱利诱、威胁等手段,与其相继发生8次性关系。
上游新闻记者注意到,邱吉林在8次性侵小小时,均选择了双流区的酒店进行犯罪。
检方指控,邱吉林除了性侵小小外,还拍摄了小小的裸照,记录了侵犯过程,还将这些裸照和视频两次发送给朋友进行炫耀。
检方认定,邱吉林在2019年10月19日性侵小小时,还拍摄了她手机通话记录的页面,其中包括小小母亲和其他亲属的电话号码。
小小的母亲朱琴华对上游新闻记者表示,邱吉林不仅通过拍摄小小裸照以传给她朋友的方式相威胁,还威胁将这些事告诉其家人,“邱吉林记录我和其他亲戚电话号码的目的,就是为了威胁小小不要把这些事告诉我们,以达到控制小小的目的。”
鉴定书证实,邱吉林是小小引产胎儿的父亲。图片来源 / 受访者提供
庭审中,邱吉林承认了曾同小小发生性关系,但否认知道小小的年龄,其辩护人为他做了轻罪辩护。
检方在庭审中指出,邱吉林曾询问过小小的同学小小的年龄,同时根据邱吉林和小小同学聊天记录也可以认定,邱吉林知道或者应当知道小小未成年。
朱琴华告诉上游新闻记者,邱吉林曾不止一次地通过聊天软件添加过小小同学,“还曾把小小的裸照发给她的同学,不止一次询问小小的年龄。”
上游新闻记者获悉,小小母亲朱琴华以刑事附带民事原告人的身份,向法院提出了民事赔偿请求,要求邱吉林赔偿医疗费、护理费等共计83万余元。
12月16日庭审结束后,双流区人民法院未对此案当庭宣判。
小小的母亲朱琴华告诉上游新闻记者,获悉邱吉林曾向朋友炫耀性侵过未成年少女、发送小小裸照给其他人之后十分气愤,“我唯一的要求就是法院对他重判。”朱琴华称,小小被性侵一案审理结束后,她也希望能够搞清楚为何邱吉林在被以强奸罪立案侦查后,可以在当天取保候审,取保候审期间还可以在全国范围内自由行动,警方为何没有在DNA报告出来后对其变更刑事强制措施,“女儿生前不仅一次问过我,为什么不及时抓邱吉林?这也是我的疑问。”
上游新闻记者 胡磊

以 “强奸” 这个词为例

正常匹配出来的开始位置应该是 80,结束位置是82
但实际结果是:79,81
问题是因为在 其辩护人为他做了轻罪辩护。 这句后面有个 \n 符号

以上两个结果是基于第一问题我改了代码后匹配出来的位置。

            var txt = @"庭审中,邱吉林承认了曾同小小发生性关系,但否认知道小小的年龄,其辩护人为他做了轻罪辩护。
12月16日,备受关注的成都市双流区14岁未成年女生小小(化名)遭遇强奸后跳楼事件在双流区人民法院开庭审理。双流区人民检察院指控,2019年8月至12月期间,被告人邱吉林在明知小小不满14周岁的情况下,采取金钱利诱、威胁等手段,与其相继发生8次性关系,期间还两次拍摄性侵视频并传播。检方认为,被告人邱吉林多次奸淫不满十四周岁的幼女,并造成被害人怀孕等后果,情节特别恶劣,罪行极其严重,应当以强奸罪追究其刑事责任。
上游新闻记者了解到,被告人邱吉林当庭承认了自己曾与小小发生过性关系,但否认知道其具体年龄,代理律师为他做了轻罪辩护。
被害人小小的母亲表示,不接受邱吉林的任何道歉与赔偿,希望法院能够对其重判。
取保候审期间,邱吉林发布的出行照片。图片来源 / 网页截图
此前,上游新闻刊发的《成都14岁女生被强奸引产后自杀,涉案企业老板取保候审后疑似西藏旅游》《成都少女被强奸后自杀 媒体报道3天后嫌犯被批捕》报道显示,小小的母亲朱琴华表示,女儿生前曾遭企业老板邱吉林的伤害:邱吉林先通过利诱小小发送裸照,再利用裸照胁迫小小发生关系并导致小小怀孕。2月3日,小小发现自己怀孕,到医院检查后发现已怀孕15周。2月4日,成都市公安局双流区分局就小小被强奸一案正式立案侦查,邱吉林被取保候审。成都市公安局双流区分局5月8日作出的鉴定意见书显示,“邱吉林是小小引产胎儿的生物学父亲”。
6月28日晚,小小在位于双流区的家中结束了自己的生命。
今年7月2日,媒体广泛报道了小小的遭遇后,双流警方将已经取保候审近5个月的邱吉林刑事拘留,7月16日邱吉林被逮捕,10月30日检方移送法院起诉。
双流区人民检察院指控,2019年8月20日,邱吉林与被害人小小相互添加为QQ好友并进行聊天。2019年8月至12月期间,邱吉林林在明知小小不满14周岁的情况下,采取金钱利诱、威胁等手段,与其相继发生8次性关系。
上游新闻记者注意到,邱吉林在8次性侵小小时,均选择了双流区的酒店进行犯罪。
检方指控,邱吉林除了性侵小小外,还拍摄了小小的裸照,记录了侵犯过程,还将这些裸照和视频两次发送给朋友进行炫耀。
检方认定,邱吉林在2019年10月19日性侵小小时,还拍摄了她手机通话记录的页面,其中包括小小母亲和其他亲属的电话号码。
小小的母亲朱琴华对上游新闻记者表示,邱吉林不仅通过拍摄小小裸照以传给她朋友的方式相威胁,还威胁将这些事告诉其家人,“邱吉林记录我和其他亲戚电话号码的目的,就是为了威胁小小不要把这些事告诉我们,以达到控制小小的目的。”
鉴定书证实,邱吉林是小小引产胎儿的父亲。图片来源 / 受访者提供
庭审中,邱吉林承认了曾同小小发生性关系,但否认知道小小的年龄,其辩护人为他做了轻罪辩护。
检方在庭审中指出,邱吉林曾询问过小小的同学小小的年龄,同时根据邱吉林和小小同学聊天记录也可以认定,邱吉林知道或者应当知道小小未成年。
朱琴华告诉上游新闻记者,邱吉林曾不止一次地通过聊天软件添加过小小同学,“还曾把小小的裸照发给她的同学,不止一次询问小小的年龄。”
上游新闻记者获悉,小小母亲朱琴华以刑事附带民事原告人的身份,向法院提出了民事赔偿请求,要求邱吉林赔偿医疗费、护理费等共计83万余元。
12月16日庭审结束后,双流区人民法院未对此案当庭宣判。
小小的母亲朱琴华告诉上游新闻记者,获悉邱吉林曾向朋友炫耀性侵过未成年少女、发送小小裸照给其他人之后十分气愤,“我唯一的要求就是法院对他重判。”朱琴华称,小小被性侵一案审理结束后,她也希望能够搞清楚为何邱吉林在被以强奸罪立案侦查后,可以在当天取保候审,取保候审期间还可以在全国范围内自由行动,警方为何没有在DNA报告出来后对其变更刑事强制措施,“女儿生前不仅一次问过我,为什么不及时抓邱吉林?这也是我的疑问。”
上游新闻记者 胡磊";


            WordsSearch wordsSearch = new WordsSearch();
            wordsSearch.SetKeywords(new string[] { "强奸" });

            var ws = wordsSearch.FindAll(txt);
            foreach (var w in ws)
            {
                Assert.AreEqual('强', txt[w.Start]);
                Assert.AreEqual('奸', txt[w.End]);
            }

经测试,未发现bug

第一个问题,你对WordsSearchResult的End有误解。。。

第一个问题,你对WordsSearchResult的End有误解。。。

我看代码注释中写的是结束位置。。。