正規表現の作成に使用されたテキストを返す可能性はありますか?
このようなもの:
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には何もありません。(または少なくとも私は気づかなかった)
正規表現の作成に使用されたテキストを返す可能性はありますか?
このようなもの:
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には何もありません。(または少なくとも私は気づかなかった)
いいえ、正規表現をコンパイルするため、コンパイル後に文字列を格納することすらできないと思います。
最善の方法は、作成時に文字列を自分で保存することです。
ご覧のとおり、パターン文字列は保存されず、バイトコードのみが保存されます。
通常、サブタイプを使用すると機能しますが、残念ながら、テンプレートの制約が失敗したため、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の厄介な部分であることがわかりました。