複数の文字列検索のために stdlib に組み込まれているものはありますか。車輪の再発明はしたくありません。std.string.indexOf は単一の文字列と文字の検索を処理しますが、私が見たのはそれだけです。
3 に答える
おそらくごまかして、干し草の山で.ptrを使用し、ポインタ演算で結果スライスを見つけて、インデックスをすばやく取得することができますが、これは非常にクールなバダスの場合のみです。
本当の質問は次のとおりです。インデックスまたはカウントが必要ですか?(ユニコード)文字列について話しているので、根本的な違いがあります。
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 を使用してそのインデックスを見つけることができます。
残念ながら、2回の検索が必要です。おそらくごまかして干し草の山で .ptr を使用し、結果のスライスをポインター演算で見つけてインデックスをすばやく取得することもできますが、それは超クールなワルのためだけです。
正確に必要なものの例(入力の例と期待される出力の例)を提供しなかったので、std.algorithmモジュールについてもっと知りたいと思うかもしれないことを指摘しておきます。文字列だけでなく、あらゆる種類の検索を実行できます...