regex problems

seany via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat Sep 20 08:28:52 PDT 2014


consider this:


import std.conv, std.algorithm;
import core.vararg;
import std.stdio, std.regex;

void main()
{

     string haystack = "ID : generateWorld;
						    Position : { &
										      {ID : \" absolute ; Coordinate : , NULL OMEGA;}
										      {ID : \" inclusion ; Coordinate : UNDEF;}
										      {ID : \" subarc; Coordinate : , NULL OMEGA;	}
								      }; ID : ";
								
     // thus, something like *{B}* can not end here,
     // but something like X can start here.

     string needle = 
"(?<!(([.\n\r])*(\\{)([.\n\r])*))(ID(\\p{White_Space})*:(\\p{White_Space})*)(?!(([.\n\r])*(\\})([.\n\r])*))";

     auto r = regex(needle, "g");
     auto m = matchAll(haystack, r);

     foreach (c; m)
       writeln(c.hit);

}


So let us break up needle:

(
?<!
   (
     ([.\n\r])*(\\{)([.\n\r])*
   )
)

Do not match somthing, that may contain a "*{*" as a leading 
match, * this time means any character, including \n and \r

(ID(\\p{White_Space})*:(\\p{White_Space})*)

however, look for the form : "ID" <few blank spaces> ":" < more 
blank spaces>

(?!(([.\n\r])*(\\})([.\n\r])*))

but no trailing "*}*" as a trailing match.

In haystack, there are two such "ID :" -s. once at the beginning, 
ID : generateWorld. and then the final, last ID

However, this is returning all 5 ID-s as match

what am I doing wrong?


More information about the Digitalmars-d-learn mailing list