猿问

如何检查文本是否包含 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 string了word == sapmWord。我知道这是因为removePunctuation返回无法与字符串(unit8)比较的符文(又名 int32)。但是删除标点符号对于该功能的工作是必不可少的,所以我想知道如何解决这个问题?或者也许有一种更惯用的方式来做到这一点?


侃侃尔雅
浏览 137回答 2
2回答

MM们

考虑使用地图进行查找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    }}如果您重复检查同一组单词,则设置一次地图并重复使用它

HUWWW

您正在尝试比较一个字母和一个字符串。当你在做for _, word := range text的时候,它不是词,它是letter。如果你想要单词,你必须将字符串分割成一片单词textArr := strings.Split(text, " ")(由空格分割)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)    textArr := strings.Split(text, ` `)    sort.Strings(spamWords)    for _, word := range textArr {        for _, sapmWord := range spamWords {            if word == sapmWord {                return true            }        }    }    return false}
随时随地看视频慕课网APP

相关分类

Go
我要回答