`find` has an overload that doesn't take a needle but requires an unary predicate function. `findSplitBefore` and `findSplitAfter` should have equivalent overloads.
Test illustrating use:
----
unittest
{
import std.algorithm : findSplitBefore;
import std.uni : isWhite;
import std.string : stripLeft;
immutable tests = [
"prefix postfix lorem ipsum",
"prefix\tpostfix lorem ipsum"
];
foreach(test; tests)
{
auto result = test.findSplitBefore!isWhite();
assert(result[0] == "prefix");
assert(result[1].stripLeft() == "postfix lorem ipsum");
}
}
----
It would be especially useful because `until` is strictly lazy and thus can't be used with slicing to reproduce the above results.
Comment #1 by luis — 2018-03-21T18:25:16Z
Yup, I've ran into the same issue multiple times. This last time with the plain findSplit; I don't recall if also with findSplitBefore/After.
This workaround works:
range.byCodeUnit.findSplit!((a, b) => a.isWhite)(" ");
Interestingly, if you use "" instead of " " it won't work, which arguably is a bug, since the predicate doesn't even use b.
Comment #2 by robert.schadek — 2024-12-01T16:18:40Z