D 单程文件扫描

D 单程文件扫描,d,monads,higher-order-functions,fileparsing,D,Monads,Higher Order Functions,Fileparsing,在我的文件扫描D程序中,我实现了一种逻辑,用于查找一组键字符串的所有命中,以及类似于Grep的行和列上下文 我当前的算法是调用find,直到文件结束。当找到命中时,我会前后搜索以检测命中行开始和结束的字节偏移量。然后我再次向后搜索,以查找文件开头和点击开始偏移量之间的换行数。当然,这不是一个高效、优雅的解决方案,但它目前正在发挥作用,并且有助于理解我是如何在切片上操作的 我现在想重构这段代码,以使用一些状态机(monad)的组合,这些状态机只需抛出文件一次,就可以对目前发现的一系列行开始进行更新

在我的文件扫描D程序中,我实现了一种逻辑,用于查找一组键字符串的所有命中,以及类似于Grep的行和列上下文

我当前的算法是调用
find
,直到文件结束。当找到命中时,我会前后搜索以检测命中行开始和结束的字节偏移量。然后我再次向后搜索,以查找文件开头和点击开始偏移量之间的换行数。当然,这不是一个高效、优雅的解决方案,但它目前正在发挥作用,并且有助于理解我是如何在切片上操作的


我现在想重构这段代码,以使用一些状态机(monad)的组合,这些状态机只需抛出文件一次,就可以对目前发现的一系列行开始进行更新和操作(
size\t[]
)。这种解决方案应该基于什么
std.algorithm
s?该算法应该输出一个元组数组,其中每个元组包含一个命中片段、bol/eol片段和行号。

只需迭代所有行并保持当前行号,就更简单、更容易了

foreach(n, line; lines(file))
{
    auto index = indexOf(line,needle);
    if(index>=0){
        writeln(n, ", ", index);
    }
}

是的,但我希望支持搜索跨多行的键。我想让这和排队计数一样。当然,我可以在每一行中执行子字符串搜索,然后实现一些特殊行为,继续在下一行中搜索。但我不确定这是最普遍的解决办法。如果第一个指针是换行符(或者如果我们想要所有版本的换行编码,那么是一组指针),其余的是搜索字符串,那么继续调用变量查找会怎么样?@Nordlöw当答案中只有一行时,您可以将指针拆分为行,使用版本。当有多行时,您可以对针的第一行执行
endsWith
,然后对下一行执行
equals
,最后使用针的最后一行开始执行
。顺便问一下:我应该何时使用
find
的针变量版本而不是
(ct)Regex
?性能原因?请注意,
indexOf
不推荐使用
countUntil
。我更新了代码。我的案例中的输入文件是一个内存文件。我应该使用
std.algorithm
中的算法还是
std.string
中的算法来分割行?我目前没有假设文件的Unicode正确性,所以我想我应该使用
std.algorithm
中的
splitter
,对吗?