用于搜索字符串中第一次出现多个字符串或字符的函数

时间:2013-01-10 16:36:13

标签: d

stdlib是否内置了多个字符串搜索功能。我不想重新发明轮子。 std.string.indexOf处理单个字符串和字符搜索,但这就是我所看到的。

3 个答案:

答案 0 :(得分:4)

  

你可能会作弊,只是在干草堆上使用.ptr并找到   使用指针算术的结果切片来快速获得索引但是   这只适用于过冷坏事

真正的问题是:您想要索引还是计数?由于我们讨论的是(unicode)字符串,因此存在根本区别。

countUntil相反,

indexOf返回一个" amF的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);
}

答案 1 :(得分:3)

std.algorithm.countUntil是查找索引的常用方法,但莫名其妙地不接受多针。其他几个std.algorithm函数也可以。这应该有效:

import 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并使用指针算法查找结果切片以快速获取索引,但这仅适用于supercool badasses。

答案 2 :(得分:1)

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