digitalmars.D.learn - Pass RegexMatch to a function?
- Gerald (42/42) Aug 08 2016 I have a RegexMatch that I want to pass to a function that takes
- Jonathan M Davis via Digitalmars-d-learn (19/61) Aug 08 2016 RegexMatch is a templated type, so if you type RegexMatch, you're not
I have a RegexMatch that I want to pass to a function that takes
the match and replaces various tokens in a string with the match
and/or individual groups of the match. I'm struggling to figure
out how to pass a RegexMatch to a function, right now I have code
like the follows:
RegexMatch regexMatch = matchAll(urlMatch.match,
regex(tr.pattern, tr.caseless?"i":""));
string command = replaceMatchTokens(urlMatch.match, regexMatch);
...
string replaceMatchTokens(string tokenizedText, ref RegexMatch
match) {
string result = tokenizedText.replace("$0", match.match);
int i = 0;
foreach(group; match.captures) {
result = result.replace("$" ~ to!string(i), group);
i++;
}
return result;
}
When I try to compile this, it fails with the follow on the line
where replaceMatchTokens is declared:
Error: struct std.regex.RegexMatch(R, alias Engine =
ThompsonMatcher) if (isSomeString!R) is used as a type
I've also tried declaring it as follows:
string replaceMatchTokens(string tokenizedText, ref
RegexMatch!(string, ThompsonMatcher) match) {
With the following errors:
source/gx/terminix/terminal/terminal.d(1273,28): Error: struct
std.regex.RegexMatch(R, alias Engine = ThompsonMatcher) if
(isSomeString!R) is used as a type
source/gx/terminix/terminal/terminal.d(2701,54): Error: template
std.regex.match cannot deduce function from argument types
!()(RegexMatch!(string, ThompsonMatcher)), candidates are:
/usr/include/dlang/dmd/std/regex/package.d(777,13):
std.regex.match(R, RegEx)(R input, RegEx re) if (isSomeString!R
&& is(RegEx == Regex!(BasicElementOf!R)))
/usr/include/dlang/dmd/std/regex/package.d(785,13):
std.regex.match(R, String)(R input, String re) if (isSomeString!R
&& isSomeString!String)
/usr/include/dlang/dmd/std/regex/package.d(792,13):
std.regex.match(R, RegEx)(R input, RegEx re) if (isSomeString!R
&& is(RegEx == StaticRegex!(BasicElementOf!R)))
Aug 08 2016
On Tuesday, August 09, 2016 01:07:53 Gerald via Digitalmars-d-learn wrote:
I have a RegexMatch that I want to pass to a function that takes
the match and replaces various tokens in a string with the match
and/or individual groups of the match. I'm struggling to figure
out how to pass a RegexMatch to a function, right now I have code
like the follows:
RegexMatch regexMatch = matchAll(urlMatch.match,
regex(tr.pattern, tr.caseless?"i":""));
string command = replaceMatchTokens(urlMatch.match, regexMatch);
...
string replaceMatchTokens(string tokenizedText, ref RegexMatch
match) {
string result = tokenizedText.replace("$0", match.match);
int i = 0;
foreach(group; match.captures) {
result = result.replace("$" ~ to!string(i), group);
i++;
}
return result;
}
When I try to compile this, it fails with the follow on the line
where replaceMatchTokens is declared:
Error: struct std.regex.RegexMatch(R, alias Engine =
ThompsonMatcher) if (isSomeString!R) is used as a type
I've also tried declaring it as follows:
string replaceMatchTokens(string tokenizedText, ref
RegexMatch!(string, ThompsonMatcher) match) {
With the following errors:
source/gx/terminix/terminal/terminal.d(1273,28): Error: struct
std.regex.RegexMatch(R, alias Engine = ThompsonMatcher) if
(isSomeString!R) is used as a type
source/gx/terminix/terminal/terminal.d(2701,54): Error: template
std.regex.match cannot deduce function from argument types
!()(RegexMatch!(string, ThompsonMatcher)), candidates are:
/usr/include/dlang/dmd/std/regex/package.d(777,13):
std.regex.match(R, RegEx)(R input, RegEx re) if (isSomeString!R
&& is(RegEx == Regex!(BasicElementOf!R)))
/usr/include/dlang/dmd/std/regex/package.d(785,13):
std.regex.match(R, String)(R input, String re) if (isSomeString!R
&& isSomeString!String)
/usr/include/dlang/dmd/std/regex/package.d(792,13):
std.regex.match(R, RegEx)(R input, RegEx re) if (isSomeString!R
&& is(RegEx == StaticRegex!(BasicElementOf!R)))
RegexMatch is a templated type, so if you type RegexMatch, you're not
providing an actual type - just the name of the template used to generate a
type. For instance, if you have
struct S(T)
{
T member;
}
S would be meaningless in most cases. It would be instantiations of S such
as S!int or S!string which would actually be types. Almost always, the
solution when dealing with templated types is to templatize your function
(you can specify the exact instantiation you're using, but that can get
pretty ugly. In this case, what you probably want is something like
string replaceMatchTokens(RM)(string tokenizedText, RM match)
if(std.traits.isInstanceOf(RegexMatch, RM))
{
...
}
- Jonathan M Davis
Aug 08 2016








Jonathan M Davis via Digitalmars-d-learn