On 30.12.2015 12:06, Ivan Kazmenko wrote:
import std.regex, std.stdio;
void main ()
{
writeln (bmatch ("abab", r"(..).*\1")); // [["abab", "ab"]]
writeln (match ("abab", r"(..).*\1")); // [["abab", "ab"]]
writeln (matchAll ("abab", r"(..).*\1")); // [["abab", "ab"]]
writeln (bmatch ("xabab", r"(..).*\1")); // [["abab", "ab"]]
writeln (match ("xabab", r"(..).*\1")); // []
writeln (matchAll ("xabab", r"(..).*\1")); // []
}
As you can see, bmatch (usage discouraged in the docs) gives me the
result I want, but match (also discouraged) and matchAll (way to go) don't.
Am I misusing matchAll, or is this a bug?
The `\1` there is a backreference. Backreferences are not part of
regular expressions, in the sense that they allow you to describe more
than regular languages. [1]
As far as I know, bmatch uses a widespread matching mechanism, while
match/matchAll use a different, less common one. It wouldn't surprise me
if match/matchAll simply didn't support backreferences.
Backreferences are not documented, as far as I can see, but they're
working in other patterns. So, yeah, this is possibly a bug.
[1]
https://en.wikipedia.org/wiki/Regular_expression#Patterns_for_non-regular_languages