在Kotlin中使用正则表达式将数据上传到内存中[已关闭]

htrmnn0y  于 2023-06-24  发布在  Kotlin
关注(0)|答案(1)|浏览(95)

已关闭,此问题需要details or clarity。目前不接受答复。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。

21小时前关门了。
Improve this question
这个问题是关于正则表达式的两种形式:“\w+”和“\W+”,用于将字符串数据存储到两种不同的数据结构中,即List和Sequence。
在第一个场景中,“\w+”与函数findAll(contents)(regex类的成员函数)沿着将单个单词作为序列存储在数据结构中。单个单词被存储在存储器中,其中第一个单词指向下一个单词,依此类推。相反,第二个场景使用“\W+”沿着一个高阶函数将相同的数据存储到String类型的列表中。
代码块提供了对这两个场景的进一步阐述。虽然第一种情况下的数据节点存储单词和单词在内容中所处的范围,但是在第二种情况下,单个单词存储在列表内的单独单元格内。
该查询是关于编译器如何保留每个单词范围的索引的。

fun main() {
    val contents = "I saw a fox in the wood"

    // region 1. build sequence of all words within the contents!
    val regexSqu = """\w+""".toRegex()
    val wordsSqu = regexSqu.findAll(contents)
    wordsSqu.forEach { word -> // word is the address of word rather that the value
        println("${word.range}: ${word.value}")
    }
    // endregion

    // region 2. build list of all words
    val regexList = """\W+""".toRegex()
    val wordsList = regexList.split(contents).filter { it.isNotBlank() }
    println(wordsList)

    wordsSqu.forEach { word ->
        println("${word.range}: ${word.value}")
    }
    // endregion
}
68bkxrlz

68bkxrlz1#

该范围未存储在任何位置。String s没有任何“它来自哪里”的概念。

进一步说明

这两个函数的区别在于返回类型。findAll返回Sequence<MatchResult>split返回List<String>。重要的部分不是SequenceList,而是MatchResultStringMatchResult是一个对象,包含找到的匹配项的信息,包括找到了什么值以及在哪里找到的。
至于为什么,使用findAll,你基本上是在说 “去找到所有匹配的东西,然后向我报告”。另一方面,对于split,你会说“去找到所有匹配的东西,丢弃它,然后把剩下的东西还给我”。所以没有匹配的报告范围。这就是为什么使用\W+,它与\w+相反。

相关问题