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 
}

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の厄介な部分であることがわかりました。

于 2012-05-01T16:22:53.917 に答える