文本处理(Text)
字符串的方法面覆盖查找、裁剪、变形、拆合与比较,反复拼接另有 StringBuilder。除注明外方法都是只读的,返回新字符串。
查找与判断
val s = "Hello, Mush";
print(s.Length, s.IsEmpty, " ".IsNullOrWhiteSpace());
print(s.Contains("mus", true), s.StartsWith("Hell"), s.EndsWith("xyz"));
print(s.IndexOf("o"), s.IndexOf("o", 5), s.LastIndexOf("o"));11 False True
True True False
4 -1 4Contains / StartsWith / EndsWith / IndexOf 都带可选的 ignoreCase 参数(大小写不敏感比较)。IndexOf 可给起始下标,未命中返回 -1。
裁剪与变形
val s = "Hello, Mush";
print(s.Substr(7), s.Substr(0, 5), s.Substring(7, 2));
print(s.ToUpper(), s.ToLower());
print(" 甲乙 ".Trim(), "甲乙".PadLeft(5, '.'), "ab".Repeat(3));
print(s.Replace("Mush", "World"));Mush Hello Mu
HELLO, MUSH hello, mush
甲乙 ...甲乙 ababab
Hello, WorldSubstr(起, 长度)长度省略即到末尾,Substring是别名。Trim/TrimStart/TrimEnd去空白。PadLeft/PadRight按簇数补到目标宽度。Repeat(n)重复,n 非正得空串。
插入、删除与反转
val s = "Hello, Mush";
print(s.Insert(5, "!!"), s.Remove(5));
print("abcdef".Reverse());Hello!!, Mush Hello
fedcbaRemove(起, 长度) 长度省略即删到末尾。Reverse 按簇序反转,多簇字符不会被拆碎。
单簇访问
val s = "Hello, Mush";
print(s.CharAt(7), "é".CodePointAt(0));M 233CharAt(下标)取第 index 个字形簇(返回 string),越界报 MS6024)。CodePointAt(下标)取该簇首标量的码点。Get(下标)是对应的 fail 形:按同样的字形簇语义取簇,越界 failIndexOutOfRange。
val s = "héllo";
print(try? s.Get(1) ?? "?");
val t = "你好";
print(try? t.Get(1) ?? "?");é
好CharAt / Get 返回的是原串切片,结果可直接继续字符串操作,要单字符值就取索引形。
val family = "a👨👩👧b";
print(family[1] == '👨👩👧', family.CharAt(1) == "👨👩👧");True True拆分与拼接
print("a,b,,c".Split(","), "a,b,,c".Split(",", true));
print("1-2-3".Split("-"));
print(", ".Join(["甲", "乙"]));[a, b, , c] [a, b, c]
[1, 2, 3]
甲, 乙Split(分隔符) 返回 string[],默认保留空段,第二参数 true 剔除空段。Join 的接收者是分隔符,参数是序列(数组或列表都收)。
比较与杂项
print("abc".Compare("abd"), "b".Compare("a"));-1 1Compare 返回负数、零、正数表达次序,Equals(other, ignoreCase) 做等值判断。字符串的排序比较是序数语义,见运算符。
StringBuilder
循环里大量 + 拼接会产生大量中间字符串。StringBuilder 在内部缓冲区累积拼接,最后一次性 ToString():
import Text.*;
val sb = new StringBuilder();
sb.Append("第一段");
sb.AppendLine("");
sb.Append("第二段 ");
sb.Append("续");
print(sb.ToString());
print(sb.Length);
sb.Clear();
print(sb.Length, sb.ToString() == "");第一段
第二段 续
9
0 TrueAppend 返回自身,可以链下去,AppendLine(s) 追加内容加换行(必须带参数)。StringBuilder 在 std 的 Text 模块里,裸名使用需要 import Text.*;。
注意
- 所有下标与长度都按字形簇计,不是字节或 UTF-16 单元,见 Unicode 与字形簇。
- 数值的
ToString(format)格式与插值共用一张表,见字符串插值。
最后更新于 2026年10月10日
