Skip to content

字符串(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 库 使用)

cpro 目前处于测试阶段