2

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

像这样的东西:

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对此没有任何内容。(或者至少我没有注意到)

4

2 回答 2

3

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

最好的办法就是在创建时自己存储字符串。

来源struct Regex

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

于 2012-05-01T07:27:58.157 回答
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 
}

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

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 中一个尴尬的部分,可以改进。

于 2012-05-01T16:22:53.917 回答