android - Kotlin 检查字符串中的单词
问题描述
我有一个 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() }
解决方案
您可以构建一个正则表达式
\b(?:word1|word2|word3...)\b
请参阅正则表达式演示。然后,将其与Regex.containsMatchIn
方法一起使用:
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
请参阅此 Kotlin 演示。
在这里,nsfw.joinToString(separator="|")
用管道(交替运算符)连接单词并"\\b(?:${nsfw.joinToString(separator="|")})\\b"
创建正确的正则表达式。
如果您的单词可能包含特殊的正则表达式元字符,例如+
, ?
, (
,)
等,您需要使用以下方法nsfw
“预处理”这些值:Regex.escape
val rx = Regex("\\b(?:${nsfw.map{Regex.escape(it)}.joinToString("|")})\\b")
^^^^^^^^^^^^^^^^^^^^^^
请参阅Kotlin 演示。
还有一件事:如果关键字可能以字母、数字和下划线以外的字符开头/结尾,则不能依赖\b
单词边界。您可以
- 使用空白边界:
val rx = Regex("(?<!\\S)(?:${nsfw.map{Regex.escape(it)}.joinToString("|")})(?!\\S)")
- 使用明确的词边界:
val rx = Regex("(?<!\\w)(?:${nsfw.map{Regex.escape(it)}.joinToString("|")})(?!\\w)")
推荐阅读
- javascript - HTML5 / CSS3 / JavaScript的Android
- javascript - Javascript 时间提前或落后
- excel - 使用自动筛选条件对昨天工作日的列中的所有记录筛选数据
- php - 个性化内容
- pandas - df.replace 在尝试替换熊猫数据框中的日期时没有任何效果
- python - PySpark 中的 Groupby 和 UDF/UDAF,同时保持 DataFrame 结构
- html - React - 将 html 标签放在 json 内容中
- javascript - Javascript如何获取输入
- json - NSCocoa 使用 Swift 从 PHP 脚本接收 JSON 数据时出错
- python - 访问没有循环的嵌套字典