| @system unittest |
| { |
| import std.regex; |
| |
| void test(S)() |
| { |
| // multi-pattern regex example |
| S[] arr = [`([a-z]+):(\d+)`, `(\d+),\d+`]; |
| auto multi = regex(arr); // multi regex |
| S str = "abc:43 12,34"; |
| auto m = str.matchAll(multi); |
| assert(m.front.whichPattern == 1); |
| assert(m.front[1] == "abc"); |
| assert(m.front[2] == "43"); |
| m.popFront(); |
| assert(m.front.whichPattern == 2); |
| assert(m.front[1] == "12"); |
| } |
| |
| import std.meta : AliasSeq; |
| static foreach (C; AliasSeq!(string, wstring, dstring)) |
| // Test with const array of patterns - see https://issues.dlang.org/show_bug.cgi?id=20301 |
| static foreach (S; AliasSeq!(C, const C, immutable C)) |
| test!S(); |
| } |
| |
| @system unittest |
| { |
| import std.regex; |
| |
| import std.regex; |
| assert(matchFirst("abc", "[0-9]+", "[a-z]+").whichPattern == 2); |
| |
| } |
| |
| @system unittest |
| { |
| import std.regex; |
| |
| 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 |
| assert(c[2] == "b"); |
| assert(c.front == "abc"); |
| c.popFront(); |
| assert(c.front == "a"); |
| assert(c.back == "c"); |
| c.popBack(); |
| assert(c.back == "b"); |
| popFrontN(c, 2); |
| assert(c.empty); |
| |
| assert(!matchFirst("nothing", "something")); |
| |
| // Captures that are not matched will be null. |
| c = matchFirst("ac", regex(`a(b)?c`)); |
| assert(c); |
| assert(!c[1]); |
| } |
| |
| @system unittest |
| { |
| import std.regex; |
| |
| assert(replaceFirst("noon", regex("n"), "[$&]") == "[n]oon"); |
| } |
| |
| @system unittest |
| { |
| import std.regex; |
| |
| import std.conv : to; |
| string list = "#21 out of 46"; |
| string newList = replaceFirst!(cap => to!string(to!int(cap.hit)+1)) |
| (list, regex(`[0-9]+`)); |
| assert(newList == "#22 out of 46"); |
| } |
| |
| @system unittest |
| { |
| import std.regex; |
| |
| import std.array; |
| string m1 = "first message\n"; |
| string m2 = "second message\n"; |
| auto result = appender!string(); |
| replaceFirstInto(result, m1, regex(`([a-z]+) message`), "$1"); |
| //equivalent of the above with user-defined callback |
| replaceFirstInto!(cap=>cap[1])(result, m2, regex(`([a-z]+) message`)); |
| assert(result.data == "first\nsecond\n"); |
| } |
| |
| @system unittest |
| { |
| import std.regex; |
| |
| // insert comma as thousands delimiter |
| auto re = regex(r"(?<=\d)(?=(\d\d\d)+\b)","g"); |
| assert(replaceAll("12000 + 42100 = 54100", re, ",") == "12,000 + 42,100 = 54,100"); |
| } |
| |
| @system unittest |
| { |
| import std.regex; |
| |
| string baz(Captures!(string) m) |
| { |
| import std.string : toUpper; |
| return toUpper(m.hit); |
| } |
| // Capitalize the letters 'a' and 'r': |
| auto s = replaceAll!(baz)("Strap a rocket engine on a chicken.", |
| regex("[ar]")); |
| assert(s == "StRAp A Rocket engine on A chicken."); |
| } |
| |
| @system unittest |
| { |
| import std.regex; |
| |
| // insert comma as thousands delimiter in fifty randomly produced big numbers |
| import std.array, std.conv, std.random, std.range; |
| static re = regex(`(?<=\d)(?=(\d\d\d)+\b)`, "g"); |
| auto sink = appender!(char [])(); |
| enum ulong min = 10UL ^^ 10, max = 10UL ^^ 19; |
| foreach (i; 0 .. 50) |
| { |
| sink.clear(); |
| replaceAllInto(sink, text(uniform(min, max)), re, ","); |
| foreach (pos; iota(sink.data.length - 4, 0, -4)) |
| assert(sink.data[pos] == ','); |
| } |
| } |
| |
| @system unittest |
| { |
| import std.regex; |
| |
| import std.algorithm.comparison : equal; |
| auto s1 = ", abc, de, fg, hi, "; |
| assert(equal(splitter(s1, regex(", *")), |
| ["", "abc", "de", "fg", "hi", ""])); |
| } |
| |
| @system unittest |
| { |
| import std.regex; |
| |
| import std.algorithm.comparison : equal; |
| import std.typecons : Yes; |
| |
| auto pattern = regex(`([\.,])`); |
| |
| assert("2003.04.05" |
| .splitter!(Yes.keepSeparators)(pattern) |
| .equal(["2003", ".", "04", ".", "05"])); |
| |
| assert(",1,2,3" |
| .splitter!(Yes.keepSeparators)(pattern) |
| .equal([",", "1", ",", "2", ",", "3"])); |
| } |
| |
| @system unittest |
| { |
| import std.regex; |
| |
| import std.algorithm.comparison; |
| import std.regex; |
| string s = `This is {unfriendly} to *regex*`; |
| assert(s.escaper.equal(`This is \{unfriendly\} to \*regex\*`)); |
| } |
| |