www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Why doesn't this work...Struct std.regex.Captures

reply WhatMeForget <kheaser gmail.com> writes:
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;


assert(c.pre == " "); // Part of input preceding 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.
Jul 08 2017
parent ketmar <ketmar ketmar.no-ip.org> writes:
WhatMeForget wrote:

c.hit is undefined when `c.empty` is `true`.
Jul 08 2017