我有一个字符串输入,其中包含单词。我正在使用regex.exec(g)函数通过getWord(input)
函数获取所有单词。
因此,我的输入可能如下所示:
word word2
someword blah
从exec中获取的是包含匹配索引的对象。因此,它类似于数组:
["word", index: 0, input: "..."]
...
["someword", index: 11, input: "..."]
...
我需要轻松计算单词" someword"位于第2行,方法是使用索引(11)(因为没有其他值告诉我行数)
这是我想到的:匹配'\n'直到匹配到的\n具有比word更高的索引。不确定在10k行文件中是否可能会出现问题。
实现代码:
getLineFromIndex: (index, input) ->
regex = /\n/g
line = 1
loop
match = regex.exec(input)
break if not match? or match.index > index
line++
return line
这里可以进行一些比较大的优化。我可以保存正则表达式和上次匹配的结果,这样每次检查行号时就不必遍历整个输入了。只有当上次匹配的位置小于当前位置时,才需要重新执行正则表达式。
以下是最终的优化方案:
###
@variable content [String] is input content
###
getLineFromIndex: (index) ->
@lineMatcher = @lineMatcher || /\n/g
@lastLine = @lastLine || 1
if @eof isnt true
@lastMatch = @lastMatch || @lineMatcher.exec(@content)
if @eof or index < @lastMatch.index
return @lastLine
else
match = @lineMatcher.exec(@content)
if not @eof and match is null
@eof = true
else
@lastMatch = match
@lastLine++
return @lastLine
\n
进行拆分,这样会是一个净收益吗?那么您立即就有了行号(我认为要减1)。 - Jongware