【问题标题】:Kotlin check for words in stringKotlin 检查字符串中的单词
【发布时间】:2019-04-18 14:30:50
【问题描述】:

我有一个 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() }

【问题讨论】:

标签: android regex kotlin


【解决方案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" 创建正确的正则表达式。

如果您的单词可能包含特殊的正则表达式元字符,例如+?() 等,则需要使用Regex.escape method“预处理”nsfw 值:

val rx = Regex("\\b(?:${nsfw.map{Regex.escape(it)}.joinToString("|")})\\b")
                            ^^^^^^^^^^^^^^^^^^^^^^     

the Kotlin demo

还有一件事:如果关键字可能以字母、数字和下划线以外的字符开头/结尾,则不能依赖\b 字边界。你可以

  • 使用空白边界:val rx = Regex("(?<!\\S)(?:${nsfw.map{Regex.escape(it)}.joinToString("|")})(?!\\S)")
  • 使用明确的单词边界:val rx = Regex("(?<!\\w)(?:${nsfw.map{Regex.escape(it)}.joinToString("|")})(?!\\w)")

【讨论】:

  • 多么棒的答案,感谢您抽出宝贵的时间使其如此先进
【解决方案2】:

您可以在要检查的字符串上使用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 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    相关资源
    最近更新 更多