解析文件和构建输出的正确方法

Proper way to parse a file and build output

我正在尝试学习 D,我想在完成 hello world 之后,我可以尝试我之前在 Java 中想做的事情,因为 Regex 的方式,这是一个很大的痛苦API 有效:一个小模板引擎。 因此,我从一些简单的代码开始逐个字符地读取文件:

import std.stdio, std.file, std.uni, std.array;

void main(string [] args) {

    File f = File("src/res/test.dtl", "r"); 

    bool escape = false;
    char [] result;
    Appender!(char[]) appender = appender(result);

    foreach(c; f.rawRead(new char[f.size])) {
        if(c == '\') {
            escape = true;
            continue;
        }
        if(escape) {
            escape = false;
            // do something special
        }
        if(c == '@') {
            // start of scope
        }
        appender.put(c);
    }
    writeln(appender.data());
}

我的文件内容可能是这样的:

 <h1>@{hello}</h1>

目标是用一些传递给引擎的值替换@{hello}部分。

所以,我其实有两个问题: 1. 这是处理 D 文件中字符的好方法吗?在搜索了所有导入的模块并选择了听起来像是可以完成工作的模块后,我将其组合在一起。 2. 有时,我想访问多个字符(以改进对转义序列的检查,找到整个范围等。我应该为此对数组进行切片吗?或者 D 的正则表达式函数是否可以应对这一挑战?到目前为止,我只找到了 matchFirst 和 matchAll 方法,但我想匹配、替换和 return 到那个位置。那怎么可能呢?

D 标准库没有提供您需要的内容。你需要的叫做“string interpolation", and here is a very nice implementation in D that you can use the way you describe: https://github.com/Abscissa/scriptlike/blob/4350eb745531720764861c82e0c4e689861bb17e/src/scriptlike/core.d#L139

这是一篇关于此库的博客post:https://p0nce.github.io/d-idioms/#String-interpolation-as-a-library