D std.regex - 以文本形式返回

时间:2012-05-01 07:19:53

标签: regex d

是否有可能返回用于创建正则表达式的文本?

这样的事情:

auto r = regex(r"[0-9]", "g"); // create regular expression
writeln(r.dumpAsText());       // this would write: [0-9]

http://dlang.org/phobos/std_regex.html中没有任何内容。 (或者至少我没有注意到)

2 个答案:

答案 0 :(得分:3)

不,因为它编译正则表达式,我不相信它甚至在编译后存储字符串。

最好的办法就是将字符串存储在创作中。

Source for struct Regex

如您所见,它不存储模式字符串,只存储字节码。

答案 1 :(得分:1)

通常使用子类型会起作用,但不幸的是,ti不会因模板约束失败而导致。例如。一个看似合理的解决方案(现在不能正常工作)将包装正则表达式作为子类型:

auto myregex(string arg1, string arg2)
{
    struct RegexWrap
    {
        Regex!char reg;
        alias reg this;
        string dumpAsText;
    }

    return RegexWrap(regex(arg1, arg2), arg1);
}

void main()
{
    auto r = myregex(r"[0-9]", "g"); // create regular expression
    writeln(r.dumpAsText);       // this would write: [0-9]   
    writeln(match("12345", r));  // won't work 
}

即使使用子类型,std.regex中的match函数也无法使用此包装器结构,因为它无法使用此模板约束:

public auto match(R, RegEx)(R input, RegEx re)
    is(RegEx == Regex!(BasicElementOf!R)

即使您将标题更改为此标题,它仍然无效:

public auto match(R)(R input, Regex!(BasicElementOf!R) re)

唯一可行的方法是,如果类型是显式的,那么可以传递子类型:

public auto match(R)(R input, Regex!char re)

我发现这是D的一个可以改进的尴尬部分。