字符串(zifuchuan / string)
字符串模块不需要导入,直接使用。changdu、qu、zichuan、chazhao 这些基本方法见 字符串,本页介绍模块里的其他函数。
两种调用写法
函数的第一个参数是字符串时,可以写成方法调用,两种写法完全等价:
cpro
bl a = zifuchuan.fenge(s, ",") // 模块限定调用
bl b = s.fenge(",") // 方法调用cpro
var a = string.split(s, ",") // 模块限定调用
var b = s.split(",") // 方法调用方法写法可以连续调用:
cpro
bl name = " src/main.cp ".xiujian().qu_qianzhui("src/").qu_houzhui(".cp") // "main"cpro
var name = " src/main.cp ".trim().trim_prefix("src/").trim_suffix(".cp") // "main"第一个参数不是字符串的函数(如 pinjie)只能用模块限定的写法。
函数一览
| 拼音 | 英文 | 说明 |
|---|---|---|
| 查询 | ||
baohan(sub) | contains(sub) | 是否包含子串 |
kaitou_shi(p) | starts_with(p) | 是否以 p 开头 |
jiewei_shi(p) | ends_with(p) | 是否以 p 结尾 |
tongji(sub) | count(sub) | 子串出现次数 |
| 切分与拼接 | ||
fenge(sep) | split(sep) | 按分隔符切分 |
fenge_n(sep, n) | splitn(sep, n) | 最多切成 n 段 |
ziduan() | fields() | 按空白切分,去掉空段 |
fenhang() | lines() | 按行切分 |
pinjie(parts, sep) | join(parts, sep) | 用分隔符拼接数组 |
| 修剪 | ||
xiujian() | trim() | 去掉首尾空白 |
xiujian_shou() | trim_start() | 去掉开头空白 |
xiujian_wei() | trim_end() | 去掉结尾空白 |
qu_qianzhui(p) | trim_prefix(p) | 去掉指定前缀 |
qu_houzhui(p) | trim_suffix(p) | 去掉指定后缀 |
| 变换 | ||
tihuan(old, new) | replace(old, new) | 替换全部匹配 |
chongfu(n) | repeat(n) | 重复 n 次 |
zhuan_daxie() | to_upper() | 转大写 |
zhuan_xiaoxie() | to_lower() | 转小写 |
jiexi_i64() | parse_i64() | 解析整数,可能失败 |
所有函数都不修改原字符串,返回新的字符串或数组。除了 jiexi_i64,都不会失败,不需要 changshi。
"空白"指空格、\t、\n、\r 四种字符。
查询
cpro
bl s = "你好abc"
dayin(s.baohan("好a")) // true
dayin(s.kaitou_shi("你好")) // true
dayin("report.pdf".jiewei_shi(".pdf")) // true
dayin("a,b,c".tongji(",")) // 2
dayin("aaa".tongji("aa")) // 1,不重叠计数cpro
var s = "你好abc"
print(s.contains("好a")) // true
print(s.starts_with("你好")) // true
print("report.pdf".ends_with(".pdf")) // true
print("a,b,c".count(",")) // 2
print("aaa".count("aa")) // 1,不重叠计数切分与拼接
fenge 按分隔符切分
空段会保留,没找到分隔符时返回只含原字符串的数组:
cpro
"a,b,c".fenge(",") // ["a", "b", "c"]
"a,,b".fenge(",") // ["a", "", "b"]
",a,".fenge(",") // ["", "a", ""]
"abc".fenge(",") // ["abc"]
"".fenge(",") // [""],一个空字符串,不是空数组cpro
"a,b,c".split(",") // ["a", "b", "c"]
"a,,b".split(",") // ["a", "", "b"]
",a,".split(",") // ["", "a", ""]
"abc".split(",") // ["abc"]
"".split(",") // [""],一个空字符串,不是空数组fenge_n 最多切成 n 段
切到第 n 段就停,剩下的全部放在最后一段里。常用来解析 key=value:
cpro
"a=b=c".fenge_n("=", 2) // ["a", "b=c"]
"a=b=c".fenge_n("=", 9) // ["a", "b", "c"]
"a=b=c".fenge_n("=", 0) // []cpro
"a=b=c".splitn("=", 2) // ["a", "b=c"]
"a=b=c".splitn("=", 9) // ["a", "b", "c"]
"a=b=c".splitn("=", 0) // []ziduan 按空白切分
连续的空白算一个分隔,空段全部去掉:
cpro
" a b ".ziduan() // ["a", "b"]
"a\tb\nc".ziduan() // ["a", "b", "c"]
" ".ziduan() // []cpro
" a b ".fields() // ["a", "b"]
"a\tb\nc".fields() // ["a", "b", "c"]
" ".fields() // []fenhang 按行切分
按 \n 切分,每行末尾的 \r 会去掉,所以 Windows 换行也能正确处理。文件末尾的换行不会多出一个空行:
cpro
"a\nb\n".fenhang() // ["a", "b"]
"a\r\nb".fenhang() // ["a", "b"]
"a\n\nb".fenhang() // ["a", "", "b"]cpro
"a\nb\n".lines() // ["a", "b"]
"a\r\nb".lines() // ["a", "b"]
"a\n\nb".lines() // ["a", "", "b"]pinjie 拼接
第一个参数是数组,所以只能用模块限定写法:
cpro
zifuchuan.pinjie(["a", "b", "c"], ",") // "a,b,c"
zifuchuan.pinjie(["a", "b"], "") // "ab"cpro
string.join(["a", "b", "c"], ",") // "a,b,c"
string.join(["a", "b"], "") // "ab"遍历切分结果
切分结果要先存进变量再遍历,不能直接遍历函数返回值:
cpro
bl s = "a,b,c"
jishu (p shuyu s.fenge(",")) { } // ✗ 不能遍历临时值
bl parts leixing [zifuchuan] = s.fenge(",")
jishu (p shuyu parts) { // ✓
dayin(p)
}cpro
var s = "a,b,c"
for (p in s.split(",")) { } // ✗ 不能遍历临时值
var parts type [string] = s.split(",")
for (p in parts) { // ✓
print(p)
}修剪
cpro
" ab ".xiujian() // "ab"
" ab ".xiujian_shou() // "ab "
" ab ".xiujian_wei() // " ab"
"main.cp".qu_houzhui(".cp") // "main"
"main.cp".qu_houzhui(".rs") // "main.cp",没有这个后缀就原样返回
"aa.cp.cp".qu_houzhui(".cp") // "aa.cp",只去一次
"你好世界".qu_qianzhui("你好") // "世界"cpro
" ab ".trim() // "ab"
" ab ".trim_start() // "ab "
" ab ".trim_end() // " ab"
"main.cp".trim_suffix(".cp") // "main"
"main.cp".trim_suffix(".rs") // "main.cp",没有这个后缀就原样返回
"aa.cp.cp".trim_suffix(".cp") // "aa.cp",只去一次
"你好世界".trim_prefix("你好") // "世界"变换
cpro
"a-b-c".tihuan("-", "+") // "a+b+c"
"a-b".tihuan("-", "") // "ab"
"-".chongfu(20) // 20 个减号
"Hello 世界".zhuan_daxie() // "HELLO 世界"
"HELLO".zhuan_xiaoxie() // "hello"cpro
"a-b-c".replace("-", "+") // "a+b+c"
"a-b".replace("-", "") // "ab"
"-".repeat(20) // 20 个减号
"Hello 世界".to_upper() // "HELLO 世界"
"HELLO".to_lower() // "hello"tihuan替换全部匹配,从左到右、不重叠zhuan_daxie/zhuan_xiaoxie只转换英文字母,中文等其他字符原样保留chongfu的 n 小于等于 0 时返回空字符串
jiexi_i64 解析整数
把十进制字符串转成整数,格式严格:只允许可选的 + / - 加数字,不会自动去掉空白。可能失败,要写在 changshi 里:
cpro
changshi {
dayin("42".jiexi_i64()) // 42
dayin(" 7 ".xiujian().jiexi_i64()) // 7,先去掉空白
bl n = "4a2".jiexi_i64() // 失败
} buhuo (e) {
dayin(e.xinxi)
}cpro
try {
print("42".parse_i64()) // 42
print(" 7 ".trim().parse_i64()) // 7,先去掉空白
var n = "4a2".parse_i64() // 失败
} catch (e) {
print(e.msg)
}转成其他数字类型请用 zifuchuan_zhuan_shuzi,见 字符串。
空字符串参数
传入空字符串时:
- 查询类返回数学上的结果:
baohan("")、kaitou_shi("")为zheng,tongji("")为字符数加 1 - 会改动内容的函数什么都不做,原样返回:
tihuan("", x)、qu_qianzhui("")返回原字符串,fenge("")返回只含原字符串的数组
不支持
- 按字符集修剪、只替换前 n 个、从右边切分、填充对齐、格式化
- 完整的 Unicode 大小写转换、忽略大小写比较
- 正则表达式(请通过 调用 C 库 使用)
