stdlib是否内置了多个字符串搜索功能。我不想重新发明轮子。 std.string.indexOf处理单个字符串和字符搜索,但这就是我所看到的。
答案 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}的更多信息。模块。您可以使用它执行各种搜索,而不仅仅是使用字符串......