在D语言中使用子串的首选方法是什么?

时间:2013-12-13 15:35:43

标签: d

我用谷歌搜索但是没有运气。

我想要删除字符串的第一个字符:

string s = "hello, world";
string t = cast(string) s[1..$];  // OK
string u = s[1..$]; // ERROR, can't cast char[] to string.

好吧,我可能会错过一些东西。 cast(string)使代码更难以理解。

有没有更简单的方法来获取子串(没有强制转换)?

1 个答案:

答案 0 :(得分:11)

你根本不应该在那里施放,这些都是字符串。

如果s是char[],您可以通过指定它来强制它为字符串(就像您在示例中所做的那样),或使用to!string(s)进行转换。 to!string位于模块std.conv中。

在拥有一致类型的所有内容之后,在进行子字符串处理时,切片很好,就像你在那里做的那样,但如果有非ascii字符,你可能会想要小心一点。 string [1 .. $]会删除第一个字节,但字符可能是多个字节。

如果您import std.utf;,您将拥有一个名为stride的函数,可以检查多字节字符。

string t = s[s.stride() .. $]; // chops off the first character*, even if it is multi-byte
  • 请注意,我在这里说的是“人物”,但从技术上讲,这并不总是正确的。 Unicode字符串可能变得非常复杂。 std.uni.normalize是一个可以帮助它的函数,但它仍然不完美,切掉一个字符取决于你的具体任务。

但是,一般来说,我会说使用其他函数获取索引,然后将其切片。因此,如果您想要子世界,请执行:

import std.string;
auto index = s.indexOf("world");
if(index == -1) throw new Exception("substring 'world' not found");

auto world = s[index .. $]; // gets the substring starting from world to the end of string

indexOf这样的函数可以为您处理多字节字符的复杂性。