当前位置: > > > > 如何检查文本是否包含 Golang 列表中的任何单词?
如何检查文本是否包含 Golang 列表中的任何单词?
来源:stackoverflow
2024-04-21 22:09:34
0浏览
收藏
各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题是《如何检查文本是否包含 Golang 列表中的任何单词?》,很明显是关于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
}
}
}
}
但是我在 word == sapmword 处得到 mismatched type rune 和 string。 我知道这是因为 removepunctuation 返回符文(又名 int32),它无法与字符串(unit8)进行比较。但是删除标点符号对于该函数的工作是必不可少的,所以我想知道如何解决这个问题?或者也许有更惯用的方法来做到这一点?
解决方案
您正在尝试比较字母和字符串。
当您执行 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
}
考虑使用地图进行查找
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
}
}
如果您重复检查同一组单词,则设置一次地图并重复使用
到这里,我们也就讲完了《如何检查文本是否包含 Golang 列表中的任何单词?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注米云公众号,带你了解更多关于的知识点!
