1

stdlib 中是否有任何内置用于多字符串搜索的内容。我不想重新发明轮子。std.string.indexOf 处理单个字符串和字符搜索,但这就是我所看到的。

4

3 回答 3

4

您可能会作弊,只是在大海捞针上使用 .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);
}
于 2013-01-10T18:00:48.887 回答
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 并使用指针算法找到结果切片以快速获取索引,但这仅适用于超酷的坏蛋。

于 2013-01-10T17:23:09.187 回答
1

由于您没有给出您确切需要的示例(带有输入示例和预期输出示例),我只想指出您可能想了解有关std.algorithm模块的更多信息。您可以使用它执行各种搜索,而不仅仅是字符串......

于 2013-01-10T16:50:42.300 回答