Kotlin中Regex的findAll方法如何保留单词范围索引?
Regex.findAll生成的Sequence保留范围索引的原理
这不是编译器的特殊处理,而是Regex.findAll方法的实现逻辑决定的:
findAll返回的Sequence里装的是MatchResult实例,每个MatchResult在正则匹配过程中就已经记录了完整的匹配信息:- 正则引擎扫描目标字符串时,每找到一个符合
\w+的匹配项,会同步记录这个匹配内容在原字符串中的起始、结束索引,把这些数据封装到MatchResult对象里 - Sequence只是一个惰性求值的序列容器,它只是按顺序承载这些预先生成的
MatchResult,并不会额外处理或生成索引信息
- 正则引擎扫描目标字符串时,每找到一个符合
和
split方法的核心区别:split只关注分割后的字符串内容,按\W+这类分隔符拆分原字符串后直接提取子串,不会保留原位置;而findAll的设计目标就是捕获每个匹配的完整上下文,自然包含位置、匹配值这些细节另外要注意Sequence的惰性特性:它不会一次性生成所有
MatchResult,而是在遍历(比如调用forEach)时才逐个生成,但每个MatchResult里的范围索引,在该匹配被正则引擎找到的那一刻就已经确定并存储了
内容的提问来源于stack exchange,提问作者Meerza Al Fardan
相关产品推荐
相关产品推荐

