首页 > 解决方案 > 如何检查文本是否包含 Golang 列表中的任何单词?

问题描述

我想检查用户提交的文本中是否有垃圾邮件。所以这是我写的函数:

func TextHasSpamWords(text string, spamWords []string) bool {
    removePunctuation := func(r rune) rune {
        if strings.ContainsRune(".,:;", r) {
            return -1
        } else {
            return r
        }
    }
    text = strings.Map(removePunctuation, text)
    sort.Strings(spamWords)
    for _, word := range text {
        for _, sapmWord := range spamWords {
            if word == sapmWord {
                return true
            }
        }
    }
}

但我明白mismatched type rune and stringword == sapmWord。我知道这是因为removePunctuation返回无法与字符串(unit8)比较的符文(又名 int32)。但是删除标点符号对于该功能的工作是必不可少的,所以我想知道如何解决这个问题?或者也许有一种更惯用的方式来做到这一点?

标签: stringgo

解决方案


考虑使用地图进行查找

lookupSpam := make(map[string]bool)
for _, v := range spamWords {
    lookupSpam[v] = true
}

然后代替

for _, word := range textArr {
    for _, sapmWord := range spamWords {
        if word == sapmWord {
            return true
        }
    }
}

可以使用这样的东西

for _, word := range textArr {
    _,found:=lookupSpam[word]
    if found {
       return true
    }
}

如果您重复检查同一组单词,则设置一次地图并重复使用它


推荐阅读