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

Reply via email to