测试字符串是不是包含字符串数组中的任何内容(kotlin)

Posted

技术标签:

【中文标题】测试字符串是不是包含字符串数组中的任何内容(kotlin)【英文标题】:Test if string contains anything from an array of strings (kotlin)测试字符串是否包含字符串数组中的任何内容(kotlin) 【发布时间】:2018-11-20 04:18:07 【问题描述】:

我是 Kotlin 的新手(我有 Java 背景),我似乎不知道如何检查字符串是否包含关键字列表中的匹配项。

我想要做的是检查字符串是否包含来自关键字数组的匹配项(请不区分大小写)。如果是这样,打印出匹配的关键字和包含该关键字的字符串。 (我将遍历文件中的一堆字符串)。

这是一个适合初学者的 MVE:

val keywords = arrayOf("foo", "bar", "spam")

fun search(content: String) 
    var match = <return an array of the keywords that content contained>
    if(match.size > 0) 
          println("Found match(es): " + match + "\n" + content)
    
   

fun main(args: Array<String>) 
    var str = "I found food in the barn"
    search(str) //should print out that foo and bar were a match

作为开始(这会忽略“匹配”变量并获取匹配的关键字列表),我尝试根据我在 this question 找到的内容使用以下 if 语句,

if(Arrays.stream(keywords).parallel().anyMatch(content::contains))

但它在“内容”下放了一条波浪线并给了我这个错误

以下函数都不能使用参数调用 提供:公共运营商 fun CharSequence.contains(char: Char, ignoreCase: Boolean = ...): Boolean 定义在 kotlin.text public 运算符 fun CharSequence.contains(other: CharSequence, ignoreCase: Boolean = ...):在 kotlin.text @InlineOnly public 中定义的布尔值 内联运算符 fun CharSequence.contains(regex: Regex): Boolean 在 kotlin.text 中定义

【问题讨论】:

【参考方案1】:

这是我不使用 Streams 的方法:

fun String.containsAnyOfIgnoreCase(keywords: List<String>): Boolean 
    for (keyword in keywords) 
        if (this.contains(keyword, true)) return true
    
    return false

用法:

"test string".containsAnyOfIgnoreCase(listOf("abc","test"))

【讨论】:

你为什么要重写***?【参考方案2】:

另一个明显的选择是使用正则表达式进行不区分大小写的匹配:

arrayOf("foo", "bar", "spam").joinToString(prefix = "(?i)", separator = "|").toRegex())

使用前缀内联 (?i) 区分大小写的修饰符和关键字之间的交替将模式粘合在一起:(?i)foo|bar|spam

Sample Code:

private val keywords = arrayOf("foo", "bar", "spam")
private val pattern = keywords.joinToString(prefix = "(?i)", separator = "|")
private val rx = pattern.toRegex()

fun findKeyword(content: String): ArrayList<String>  
    var result = ArrayList<String>()
    rx.findAll(content).forEach  result.add(it.value) 
    return result


fun main(args: Array<String>)  
    println(findKeyword("Some spam and a lot of bar"));

如果您要进行一些更复杂的匹配,例如,正则表达式方法可能会很方便。非/重叠匹配添加单词边界\b等。

【讨论】:

如何修改它以仅匹配整个关键字? (例如,如果我的关键字是'foo',我只想匹配句子中的单词'foo',而不是'food') @takanuva15 keywords.joinToString(prefix = "(?i)\\b", separator = "\\b|\\b", postfix = "\\b")【参考方案3】:

您可以使用filter 函数只保留content 中包含的关键字:

val match = keywords.filter  it in content 

这里的matchList&lt;String&gt;。如果你想在结果中得到一个数组,可以添加.toTypedArray()调用。

it in content 表达式中的in 运算符与content.contains(it) 相同。

如果要进行不区分大小写的匹配,则需要在调用contains时指定ignoreCase参数:

val match = keywords.filter  content.contains(it, ignoreCase = true) 

【讨论】:

对于不区分大小写的检查,应该是keywords.filter content.contains(it, true) @MichaelButscher 感谢您的关注,我已经编辑了答案。 看起来不错,但还有一个问题:如何将搜索更改为仅返回是否在内容中找到关键字的布尔函数?有没有简单的单线解决方案? filter 替换为any

以上是关于测试字符串是不是包含字符串数组中的任何内容(kotlin)的主要内容,如果未能解决你的问题,请参考以下文章

检查字符串是不是包含任何没有regExp的字符串数组[重复]

如何检查字符串是不是包含数组中的任何元素[关闭]

检查字符串(句子空格分隔)以查看它是不是包含数组中的任何字符

如何检查一个字符串数组是不是包含 JavaScript 中的一个字符串? [复制]

从包含 R 中特定字符的字符串向量中删除条目 [重复]

检查字符串是不是包含数组的任何元素[重复]