بنقرة واحدة
cangjie-std-string
仓颉标准库 String 类型详细指南。当需要了解 String 的构造、搜索、替换、分割、拼接、裁剪、大小写转换、编码处理、下标访问、迭代等操作的完整 API 和用法时,应使用此 Skill。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
仓颉标准库 String 类型详细指南。当需要了解 String 的构造、搜索、替换、分割、拼接、裁剪、大小写转换、编码处理、下标访问、迭代等操作的完整 API 和用法时,应使用此 Skill。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
通用算法与数据结构实现参考——排序、搜索、动态规划、图算法、字符串处理的多语言惯用写法和模板代码(Python/C++/Java/Go/Cangjie)
仓颉语言算法与数据结构实现参考——排序、搜索、动态规划、图算法、字符串处理、集合操作的惯用写法和模板代码
仓颉编程语言基本概念和规则,当需要了解关键字、标识符、程序结构、变量定义(let/var/const)、值类型与引用类型、作用域规则、表达式(if/while/for-in/break/continue)、函数等基本概念时,应使用此 Skill
仓颉语言基本数据类型。当需要了解仓颉语言的整数、浮点、布尔、字符(Rune)、字符串(String)、Unit、Nothing、元组(Tuple)、数组(Array/VArray)、区间(Range)类型以及基本运算符的语法和规则时,应使用此 Skill。
仓颉程序与C程序互操作指导,包括foreign声明、CFunc、inout参数、unsafe块、调用约定、类型映射(基础类型/结构体/CPointer/VArray/CString)、C回调仓颉、内存管理等特性时,应使用此 Skill
仓颉语言类。当需要了解仓颉语言的类定义、抽象类、构造函数(init/主构造函数)、终结器(~init)、继承(单继承/sealed)、重写(override)、重定义(redef)、成员变量、成员函数、属性(prop)、访问修饰符、This类型、对象创建等特性时,应使用此 Skill。
| name | cangjie-std-string |
| description | 仓颉标准库 String 类型详细指南。当需要了解 String 的构造、搜索、替换、分割、拼接、裁剪、大小写转换、编码处理、下标访问、迭代等操作的完整 API 和用法时,应使用此 Skill。 |
String 是仓颉核心包 std.core 中的 struct 类型,无需导入 即可直接使用。
UInt32.Max(约 4 GB)Collection<Byte>、Comparable<String>、Hashable、ToString注意:
String实现了Collection<Byte>,for (b in s)迭代的是 UTF-8 字节(Byte/UInt8),而非字符。若要按字符迭代,请使用for (r in s.runes())。
// 空字符串
let s1 = ""
let s2 = String()
let s3 = String.empty // 静态常量
// 字符串字面量
let s4 = "Hello, 仓颉!"
// 多行字符串(三引号)
let s5 = """
第一行
第二行
"""
// 从 Rune 数组构造
let runes: Array<Rune> = [r'H', r'i']
let s6 = String(runes) // "Hi"
// 从 Rune 集合构造
let s7 = String(someRuneCollection)
// 从 UTF-8 字节数组构造
let bytes: Array<UInt8> = [72, 101, 108, 108, 111]
let s8 = String.fromUtf8(bytes) // "Hello"(会校验 UTF-8 合法性)
| 属性 | 类型 | 说明 |
|---|---|---|
size | Int64 | UTF-8 编码字节长度(不是字符数) |
let s = "Hello"
println(s.size) // 5
let s2 = "你好"
println(s2.size) // 6(每个汉字 3 字节 UTF-8)
join — 拼接字符串数组static func join(strArr: Array<String>, delimiter!: String = String.empty): String
let arr = ["I", "like", "Cangjie"]
let s = String.join(arr, delimiter: " ")
println(s) // "I like Cangjie"
let csv = String.join(["a", "b", "c"], delimiter: ",")
println(csv) // "a,b,c"
fromUtf8 — 从 UTF-8 字节数组构造static func fromUtf8(utf8Data: Array<UInt8>): String
IllegalArgumentExceptionlet bytes: Array<UInt8> = [72, 101, 108, 108, 111]
let s = String.fromUtf8(bytes) // "Hello"
fromUtf8Unchecked — 不校验构造(unsafe)static func fromUtf8Unchecked(utf8Data: Array<UInt8>): String
checkUtf8Encoding — 校验 UTF-8 合法性static func checkUtf8Encoding(data: Array<UInt8>): Bool
let valid = String.checkUtf8Encoding([72, 101]) // true
let invalid = String.checkUtf8Encoding([0xFF, 0xFE]) // false
contains — 包含子串func contains(str: String): Bool
"Hello World".contains("World") // true
"Hello World".contains("world") // false(大小写敏感)
startsWith / endsWith — 前缀/后缀检查func startsWith(prefix: String): Bool
func endsWith(suffix: String): Bool
"hello.cj".startsWith("hello") // true
"hello.cj".endsWith(".cj") // true
indexOf — 查找首次出现位置func indexOf(b: Byte): Option<Int64>
func indexOf(b: Byte, fromIndex: Int64): Option<Int64>
func indexOf(str: String): Option<Int64>
func indexOf(str: String, fromIndex: Int64): Option<Int64>
let s = "Hello World"
s.indexOf("World") // Some(6)
s.indexOf("xyz") // None
s.indexOf("l") // Some(2)
s.indexOf("l", 3) // Some(3) — 从索引 3 开始搜索
lastIndexOf — 查找最后出现位置func lastIndexOf(b: Byte): Option<Int64>
func lastIndexOf(b: Byte, fromIndex: Int64): Option<Int64>
func lastIndexOf(str: String): Option<Int64>
func lastIndexOf(str: String, fromIndex: Int64): Option<Int64>
"abcabc".lastIndexOf("abc") // Some(3)
count — 统计子串出现次数func count(str: String): Int64
"abababab".count("ab") // 4
isEmpty / isAscii / isAsciiBlankfunc isEmpty(): Bool // 是否为空串
func isAscii(): Bool // 是否全为 ASCII 字符
func isAsciiBlank(): Bool // 是否为空串或仅含 ASCII 空白字符
replace — 替换所有匹配子串func replace(old: String, new: String): String
"aabbcc".replace("bb", "XX") // "aaXXcc"
"aaa".replace("a", "bb") // "bbbbbb"
removePrefix / removeSuffix — 删除前缀/后缀func removePrefix(prefix: String): String
func removeSuffix(suffix: String): String
"HelloWorld".removePrefix("Hello") // "World"
"HelloWorld".removeSuffix("World") // "Hello"
"HelloWorld".removePrefix("xyz") // "HelloWorld"
split — 按分隔符分割func split(str: String, removeEmpty!: Bool = false): Array<String>
func split(str: String, maxSplits: Int64, removeEmpty!: Bool = false): Array<String>
"a,b,,c".split(",") // ["a", "b", "", "c"]
"a,b,,c".split(",", removeEmpty: true) // ["a", "b", "c"]
"a,b,c,d".split(",", 2) // ["a", "b", "c,d"] — 最多分割 2 次
lazySplit — 惰性分割(返回迭代器)func lazySplit(str: String, removeEmpty!: Bool = false): Iterator<String>
func lazySplit(str: String, maxSplits: Int64, removeEmpty!: Bool = false): Iterator<String>
split 功能相同,但返回 Iterator<String>,适合处理大字符串时避免一次性分配lines — 按行分割func lines(): Iterator<String>
let text = "line1\nline2\nline3"
for (line in text.lines()) {
println(line)
}
// 输出:
// line1
// line2
// line3
func trimAscii(): String // 两端裁剪 ASCII 空白
func trimAsciiStart(): String // 裁剪前导 ASCII 空白
func trimAsciiEnd(): String // 裁剪尾部 ASCII 空白
" hello ".trimAscii() // "hello"
" hello ".trimAsciiStart() // "hello "
" hello ".trimAsciiEnd() // " hello"
// 按 Rune 数组裁剪(移除集合中的任意字符)
func trimStart(chars: Array<Rune>): String
func trimEnd(chars: Array<Rune>): String
// 按字符串裁剪(移除前缀/后缀子串的重复出现)
func trimStart(str: String): String
func trimEnd(str: String): String
// 按谓词裁剪(移除满足条件的字符)
func trimStart(predicate: (Rune) -> Bool): String
func trimEnd(predicate: (Rune) -> Bool): String
"xxxHelloxxx".trimStart([r'x']) // "Helloxxx"
"xxxHelloxxx".trimEnd([r'x']) // "xxxHello"
"123abc456".trimStart { r => r >= r'0' && r <= r'9' } // "abc456"
func padStart(totalWidth: Int64, padding!: String = " "): String
func padEnd(totalWidth: Int64, padding!: String = " "): String
totalWidth 为目标字节宽度totalWidth,返回原字符串"42".padStart(6) // " 42"
"42".padStart(6, padding: "0") // "000042"
"42".padEnd(6) // "42 "
"42".padEnd(6, padding: ".") // "42...."
func toAsciiLower(): String // 转小写(仅 ASCII 字母)
func toAsciiUpper(): String // 转大写(仅 ASCII 字母)
func toAsciiTitle(): String // 首字母大写(仅 ASCII 字母)
"Hello World".toAsciiLower() // "hello world"
"Hello World".toAsciiUpper() // "HELLO WORLD"
"hello world".toAsciiTitle() // "Hello World"
func compare(other: String): Ordering // 字典序比较,返回 Ordering.LT/EQ/GT
func equalsIgnoreAsciiCase(other: String): Bool // 忽略 ASCII 大小写比较
"abc".compare("abd") // Ordering.LT
"Hello".equalsIgnoreAsciiCase("hello") // true
"abc" == "abc" // true
"abc" != "def" // true
"abc" < "abd" // true(字典序)
"abc" <= "abc" // true
"abd" > "abc" // true
"abd" >= "abc" // true
+ 运算符 — 字符串拼接let s = "Hello" + ", " + "World!" // "Hello, World!"
* 运算符 — 重复let s = "ab" * 3 // "ababab"
let line = "-" * 20 // "--------------------"
"${expr}"let name = "Cangjie"
let age = 3
let s = "Name: ${name}, Age: ${age}" // "Name: Cangjie, Age: 3"
String.join — 拼接数组let parts = ["2024", "06", "15"]
let date = String.join(parts, delimiter: "-") // "2024-06-15"
StringBuilder — 高效拼接大量拼接时建议使用 StringBuilder:
let sb = StringBuilder()
sb.append("Hello")
sb.append(", ")
sb.append("World!")
let result = sb.toString() // "Hello, World!"
func toArray(): Array<Byte> // 返回 UTF-8 字节数组(拷贝)
func rawData(): Array<Byte> // 返回内部原始数据引用(unsafe)
let bytes = "Hi".toArray() // [72, 105]
func toRuneArray(): Array<Rune>
let runes = "Hi你".toRuneArray() // [r'H', r'i', r'你']
func iterator(): Iterator<Byte> // 按字节迭代
func runes(): Iterator<Rune> // 按字符(Rune)迭代
// 按字符迭代
for (r in "Hello 仓颉".runes()) {
print(r)
}
// 按字节迭代
for (b in "Hello") {
print(b) // 输出 UTF-8 字节值
}
toStringfunc toString(): String // 返回自身
hashCodefunc hashCode(): Int64 // 返回哈希值,可用于 HashMap 等
let s = "Hello"
let b: Byte = s[0] // 72 (H 的 UTF-8 编码)
let opt = s.get(10) // None(安全访问,不抛异常)
注意:
s[i]返回的是Byte(UTF-8 编码字节),对于多字节字符(如中文),单个索引不能获取完整字符。
let s = "Hello World"
let sub = s[0..5] // "Hello"
let sub2 = s[6..11] // "World"
注意:切片范围基于字节索引,确保不要在多字节字符中间切断。
clonefunc clone(): String
String 是不可变类型,通常不需要手动克隆)// 1. 判断空字符串
if (s.isEmpty()) { ... }
// 2. 安全搜索
if (let Some(idx) <- s.indexOf("key")) {
println("Found at ${idx}")
}
// 3. 分割与重组
let parts = "a:b:c".split(":")
let joined = String.join(parts, delimiter: "-") // "a-b-c"
// 4. 裁剪用户输入
let input = " user@example.com ".trimAscii()
// 5. 路径处理
let filename = "path/to/file.cj"
if (filename.endsWith(".cj")) {
let name = filename.removeSuffix(".cj")
}
// 6. 按行处理文本
for (line in text.lines()) {
if (!line.isEmpty()) {
processLine(line)
}
}
// 7. 字符串重复
let separator = "=" * 40 // "========================================"
// 8. 大小写不敏感比较
if (cmd.equalsIgnoreAsciiCase("quit")) {
exit(0)
}