已关闭,此问题需要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
}
1条答案
按热度按时间68bkxrlz1#
该范围未存储在任何位置。
String
s没有任何“它来自哪里”的概念。进一步说明
这两个函数的区别在于返回类型。findAll返回
Sequence<MatchResult>
,split返回List<String>
。重要的部分不是Sequence
与List
,而是MatchResult
与String
。MatchResult
是一个对象,包含找到的匹配项的信息,包括找到了什么值以及在哪里找到的。至于为什么,使用
findAll
,你基本上是在说 “去找到所有匹配的东西,然后向我报告”。另一方面,对于split
,你会说“去找到所有匹配的东西,丢弃它,然后把剩下的东西还给我”。所以没有匹配的报告范围。这就是为什么使用\W+
,它与\w+
相反。