I was playing around with regex

import std.regex;
import std.stdio;

void main()
{
string[] fileNames = [ "011_bad.txt", "01_01_pass", "90_pass", "_bad" ];

    auto reg = regex(r"^\d{2}_");

    foreach (name; fileNames)
    {
        auto c = matchFirst(name, reg);

        //writeln(c.hit);  // Slice of matched portion of input.
        if (c.empty)
            writeln(name, " is not the form we are looking for");
        else
            writeln(name, " is a winner");
    }
}

All is good:
011_bad.txt is not the form we are looking for
01_01_pass is a winner
90_pass is a winner
_bad is not the form we are looking for


but then I uncommented the writeln(c.hit); above and all hell breaks loose:


core.exception.AssertError@/usr/include/dmd/phobos/std/regex/package.d(559): 
Assertion failure
----------------
??:? _d_assertp [0x8124936]
??:? pure nothrow @property @nogc @trusted immutable(char)[] std.regex.Captures!(immutable(char)[], uint).Captures.hit() [0x81190d6]
??:? _Dmain [0x80ff351]
??:? _D2rt6dmain211_d_run_mainUiPPaPUAAaZiZ6runAllMFZ9__lambda1MFNlZv [0x8125bbe] ??:? scope void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).tryExec(scope void delegate()) [0x8125b10] ??:? scope void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).runAll() [0x8125b7e] ??:? scope void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).tryExec(scope void delegate()) [0x8125b10]
??:? _d_run_main [0x8125aa8]
??:? main [0x8122ff3]
??:? __libc_start_main [0xb74dc275]



I got inspiration from the following "live" code at at .../captures.html. I inserted a writeln(c.hit) and here it worked!

import std.range.primitives : popFrontN;

auto c = matchFirst("@abc#", regex(`(\w)(\w)(\w)`));
assert(c.pre == "@"); // Part of input preceding match
assert(c.post == "#"); // Immediately after match
assert(c.hit == c[0] && c.hit == "abc"); // The whole match
writeln("My Addition ",c.hit);
writeln(c[2]); // "b"
writeln(c.front); // "abc"
c.popFront();
writeln(c.front); // "a"
writeln(c.back); // "c"
c.popBack();
writeln(c.back); // "b"


and it worked fine:
My Addition abc
b
abc
a
c
b


What gives?  Thanks.


Reply via email to