首页 > 其他分享 >屏蔽敏感词

屏蔽敏感词

时间:2023-12-18 19:15:50浏览次数:32  
标签:匹配 string 样例 敏感 sensitiveStr 屏蔽 result checkedStr

题目描述

为了净化网络环境,需要开发一个简易的敏感词屏蔽功能:给定敏感词,按如下规则,对待检查字符串进行匹配和替换:

  • 敏感词中的各字符顺序地出现在待检查字符串中,且第一个字符和最后一个字符之间的其它字符个数小于敏感词长度,连同其它字符一起替换为星号 *。如:敏感词 135 可匹配字符串1?3?5、1??35,不匹配1?3??5。
  • 支持贪婪匹配,即每次从左到右扫描,一旦遇到可匹配的情况就开始进行匹配,且匹配尽可能长的字符,例如:
    • 敏感词为 ab 时,字符串 abbc 应该替换成 *c ,而不是 *bc
    • 敏感词为 abc 时,字符串 aabcbc 应该替换成 *bc,而不是 a* (遇到首个 a 时就开始进行匹配)
  • 支持全量匹配,即:有多处符合匹配规则时,则需要全部进行匹配和替换。

请输出屏蔽后的字符串。

解答要求时间限制:1000ms, 内存限制:128MB 输入

第一行字符串,表示待检查字符串,仅含英文字母和数字,长度范围:[2,20]。
第二行字符串,表示敏感词,长度范围:[2,20]。

输出

屏蔽后的字符串

样例

输入样例 1 复制

ABCdfgABC
ABC

输出样例 1

*dfg*
提示样例 1

注意全量匹配,待检查字符串中有两处符合匹配规则,首个ABC以及最后一个ABC,都替换为*后,屏蔽后输出为 *dfg* 。



输入样例 2 复制

abbdefghjjk
bdfhj

输出样例 2

a*k
提示样例 2

注意贪婪匹配:从第二个字符b开始匹配到第十个字符j,中间干扰字符个数为4(含 begj),小于敏感词的长度5,因此屏蔽后输出为:a*k



输入样例 3 复制

abbbbbcde
abc

输出样例 3

abbbbbcde
提示样例 3

a 和 c之间的字符串 bbbbb 长度超过了敏感词的长度,因此无屏蔽。

 

 

考察正则算法:

贪婪匹配

 

/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved.
 * Description: 上机编程认证
 * Note: 缺省代码仅供参考,可自行决定使用、修改或删除
 * 只能import Go标准库
 */
package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
    "strings"
    "regexp"
)

// 待实现函数,在此函数中填入答题代码

func getMaskedStr(checkedStr string, sensitiveStr string) string {
    sens := strings.Join(strings.Split(sensitiveStr, ""), `\w*`)
    senStrLen := len(sensitiveStr)
    var result []string
    i := 0
    for i < len(checkedStr) {
        if checkedStr[i] == sens[0] {
            reGroup := regexp.MustCompile(sens).FindString(checkedStr[i:min(i+2*senStrLen-1, len(checkedStr))])
            if reGroup != "" {
                result = append(result, "*")
                i += len(reGroup)
                continue
            }
        }
        result = append(result, string(checkedStr[i]))
        i++
    }
    return strings.Join(result, "")
}

func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}

func main() {
    reader := bufio.NewReader(os.Stdin)
    checkedStr, err1 := readInputString(reader)
    if err1 != nil {
        fmt.Println(err1.Error())
        return
    }
    sensitiveStr, err2 := readInputString(reader)
    if err2 != nil {
        fmt.Println(err2.Error())
        return
    }
    result := getMaskedStr(checkedStr, sensitiveStr)
    fmt.Println(result)
}
func readInputString(reader *bufio.Reader) (string, error) {
    lineBuf, err := reader.ReadString('\n')
    if err != nil && err != io.EOF {
        return "nil", err
    }
    lineBuf = strings.TrimRight(lineBuf, "\r\n")
    lineBuf = strings.TrimSpace(lineBuf)
    return lineBuf, nil
}
View Code

 

 

Demo:

 

package main

import (
    "fmt"
    "regexp"
    "strings"
)

func main() {
    checkedStr := "ABCdfgABC"
    sensitiveStr := "ABC"
    maskedStr := getMaskedStr(checkedStr, sensitiveStr)
    fmt.Println(maskedStr) // 输出:*dfg*
}

func getMaskedStr(checkedStr string, sensitiveStr string) string {
    sens := strings.Join(strings.Split(sensitiveStr, ""), `\w*`)
    senStrLen := len(sensitiveStr)
    var result []string
    i := 0
    for i < len(checkedStr) {
        if checkedStr[i] == sens[0] {
            reGroup := regexp.MustCompile(sens).FindString(checkedStr[i:min(i+2*senStrLen-1, len(checkedStr))])
            if reGroup != "" {
                result = append(result, "*")
                i += len(reGroup)
                continue
            }
        }
        result = append(result, string(checkedStr[i]))
        i++
    }
    return strings.Join(result, "")
}

func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}
View Code

 

 

标签:匹配,string,样例,敏感,sensitiveStr,屏蔽,result,checkedStr
From: https://www.cnblogs.com/gongxianjin/p/17911995.html

相关文章

  • [CSharpTips]C# 控制台程序屏蔽关闭按钮,关闭快速编辑模式,注册关闭事件
    C#控制台程序屏蔽关闭按钮,关闭快速编辑模式,注册关闭事件usingSystem;usingSystem.Collections.Generic;usingSystem.Diagnostics;usingSystem.IO;usingSystem.Linq;usingSystem.Runtime.InteropServices;usingSystem.Text;usingSystem.Threading;usingSystem.......
  • verilog设计行为仿真和时序仿真不一致, 原来是敏感信号的问题
    描述最近在vivado中设计一个计算器:28bit有符号加减法,结果出现行为仿真和时序仿真不一致情况代码r_a,r_b:对计算数据a,b的寄存器存储,也是计算器的数据输入s_bit:符号位cout:28bit计算器的进位输出cout[27]:最高位进位,用来判断符号以及加法进位always@(a,b......
  • 如何屏蔽网页广告(网页中的特定元素)
    目录1.原因2.选择一个合适的过滤器3.自定义规则3.1.为什么要自定义3.2.如何自定义规则第一步:打开元素审查第二步:确认要屏蔽的元素第三步:编写规则参考1.原因非常讨厌百度页面的“百度热搜”栏目,影响了我的工作效率,因此想要找个方式屏蔽掉它2.选择一个合适的过滤器首先......
  • 才发现自己是高敏感人群(HSP)
    “你是不是太脆弱了” 这样类似的话是否总是重复出现在你的耳边,你又是否曾一度无法控制自己过分解读他人的话语最后把自己弄得精疲力尽?别担心,我们没有生病,只不过是幸运的成为“珍稀动物”而已。01全球只有百分之二十的人是高敏感人群,所以我们是珍稀动物高敏感人群的主要特征:#......
  • sensitive word 敏感词(脏词) 如何忽略无意义的字符?达到更好的过滤效果?
    忽略字符说明我们的敏感词一般都是比较连续的,比如傻帽那就有大聪明发现,可以在中间加一些字符,比如【傻!@#$帽】跳过检测,但是骂人等攻击力不减。那么,如何应对这些类似的场景呢?我们可以指定特殊字符的跳过集合,忽略掉这些无意义的字符即可。v0.11.0开始支持例子其中charIgn......
  • sensitive word 敏感词(脏词) 如何忽略无意义的字符?达到更好的过滤效果?
    忽略字符说明我们的敏感词一般都是比较连续的,比如傻帽那就有大聪明发现,可以在中间加一些字符,比如【傻!@#$帽】跳过检测,但是骂人等攻击力不减。那么,如何应对这些类似的场景呢?我们可以指定特殊字符的跳过集合,忽略掉这些无意义的字符即可。v0.11.0开始支持例子其中charIg......
  • 公司敏感数据被上传Github,吓得我赶紧改提交记录
    大家好,我是小富~说个事吧!最近公司发生了一个事故,有同事不小心把敏感数据上传到了GitHub上,结果被安全部门扫描出来了。这件事导致公司对所有员工进行了一次数据安全的培训。对于这个事我相信,有点工作经验的人都不会故意去上传这些敏感文件,多数应该是误操作导致的。这个事件也给了......
  • sensitive-word 敏感词/脏词开源工具-v.0.10.0-脏词分类标签支持
    sensitive-wordsensitive-word基于DFA算法实现的高性能敏感词工具。创作目的实现一款好用敏感词工具。基于DFA算法实现,目前敏感词库内容收录6W+(源文件18W+,经过一次删减)。后期将进行持续优化和补充敏感词库,并进一步提升算法的性能。希望可以细化敏感词的分类,感觉工作......
  • 油猴脚本屏蔽元素
    //==UserScript==//@nameBlockZhihuTag//@namespaceyour-namespace//@version1.0//@descriptionBlockaspecifictagonZhihuwebsite//@matchhttps://www.zhihu.com/*//@grantnone//==/UserScript==(function(){......
  • 为什么NBA对“反犹”如此敏感?
    如果你对篮球有一定了解,相信你肯定知道NBA著名球星 凯里·欧文。全名凯里·安德鲁·欧文(KyrieAndrewIrving),1992年3月23日出生于澳大利亚墨尔本,美国职业篮球运动员,司职控球后卫,效力于NBA布鲁克林篮网队。视频10月28日,欧文在推特上转发了一张电影的宣传图片,电影名称为《希伯来人......