원클릭으로
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)
}