stdlib 中是否有任何内置用于多字符串搜索的内容。我不想重新发明轮子。std.string.indexOf 处理单个字符串和字符搜索,但这就是我所看到的。
3 回答
您可能会作弊,只是在大海捞针上使用 .ptr 并使用指针算法找到结果切片以快速获取索引,但这仅适用于超酷的坏蛋
真正的问题是:您想要索引还是计数?由于我们谈论的是(unicode)字符串,因此存在根本区别。
countUntil
,与 相反indexOf
,返回“popFronts 的数量”,而不是数组索引。如果你的字符串包含 unicode 字符(你应该总是假设),那么它会吹到你的脸上:
来自http://dlang.org/phobos/std_algorithm.html#countUntil
assert(std.algorithm.countUntil("日本語", "本語") == 1);
assert(std.string.indexOf("日本語", "本語") == 3);
也就是说,这应该是更有效的。它只进行一次搜索:
void main()
{
auto needles = [ "abc", "def", "ghi", "jkl" ];
auto haystack = "日本語abcakllgfjekwralv";
auto intermediary1 = find(haystack, "abc", "def", "ghi", "jkl")[0]; //"abcakllgfjekwralv""
auto intermediary2 = haystack[0 .. haystack.length - intermediary1.length]; //"日本語"
auto index = intermediary2.length; // "日本語".length => 9
auto count = intermediary2.walkLength; // "日本語" => 3
assert(index == 9);
assert(count == 3);
}
std.algorithm.countUntil
是查找索引的常用方法,但它莫名其妙地不接受多针。不过,其他几个 std.algorithm 函数也可以。这应该有效:
导入 std.algorithm,std.stdio;
void main()
{
auto needles = [ "abc", "def", "ghi", "jkl" ];
auto haystack = "fdjwabcakllgfjekwralv";
auto pos = haystack.countUntil(find(haystack, "abc", "def", "ghi", "jkl")[0]);
writeln(pos); // outputs: 4
}
find 将找到匹配的针并返回一个元组,其中包含找到到字符串末尾的位置切片和匹配的针的索引。获得切片后,您可以使用 countUntil 查找其索引。
不幸的是,它确实需要两次搜索。您可能会作弊,只是在大海捞针上使用 .ptr 并使用指针算法找到结果切片以快速获取索引,但这仅适用于超酷的坏蛋。
由于您没有给出您确切需要的示例(带有输入示例和预期输出示例),我只想指出您可能想了解有关std.algorithm模块的更多信息。您可以使用它执行各种搜索,而不仅仅是字符串......