我有一个NSFW类,可以根据已知的NSFW单词列表扫描诸如项目名称和描述之类的文本。
这是测试类似字符串列表的最佳方法
let nsfw = listof(
"badword",
"curseword",
"ass",
... 200+ more
)
针对类似这样的字符串:
This is the text that contains a badword // returns true
请注意,我需要检查完整的单词。不是单词的一部分。
所以这句话:
The grass is grean // returns false
因为草不是一个坏词。
我已经尝试过类似的操作,但是它不会检查完整的单词。
val result = nsfw.filter { it in sentence.toLowerCase() }
答案 0 :(得分:1)
您可以构建像这样的正则表达式
\b(?:word1|word2|word3...)\b
请参见the regex demo。然后,将其与Regex.containsMatchIn
method一起使用:
val nsfw = listOf(
"badword",
"curseword",
"ass"
)
val s1 = "This is the text that contains a badword"
val s2 = "The grass is grean"
val rx = Regex("\\b(?:${nsfw.joinToString(separator="|")})\\b")
println(rx.containsMatchIn(s1)) // => true
println(rx.containsMatchIn(s2)) // => false
请参见this Kotlin demo。
在这里,nsfw.joinToString(separator="|")
用管道(交替运算符)将单词连接在一起,"\\b(?:${nsfw.joinToString(separator="|")})\\b"
创建正确的正则表达式。
如果您的单词可能包含特殊的正则表达式元字符,例如+
,?
,(
,)
等,则需要“预处理” {{1 }}值与Regex.escape
method:
nsfw
请参见the Kotlin demo。
还有另一件事:如果关键字可以以字母,数字和下划线以外的字符开头/结尾,则您不能依赖val rx = Regex("\\b(?:${nsfw.map{Regex.escape(it)}.joinToString("|")})\\b")
^^^^^^^^^^^^^^^^^^^^^^
字边界。您可以
\b
val rx = Regex("(?<!\\S)(?:${nsfw.map{Regex.escape(it)}.joinToString("|")})(?!\\S)")
答案 1 :(得分:0)
您可以在要检查的字符串上使用split()
,以空格作为定界符,因此可以创建其单词列表,尽管这并不总是保证所有单词都会成功提取,因为可能还存在其他单词分隔符,例如点或逗号等。如果适合您,请执行以下操作:
val nsfw = listOf(
"badword",
"curseword",
"ass"
)
val str = "This is the text that contains a badword"
val words = str.toLowerCase().split("\\s+".toRegex())
val containsBadWords = words.firstOrNull { it in nsfw } != null
println(containsBadWords)
将打印
true
如果要列出“坏词” :
val badWords = words.filter { it in nsfw }