px普贤教程PuXian
普贤教程 › 基础教程

字符串

PuXian 的字符串是 UTF-8 文本,索引与长度都按字符(而不是字节)计算。这一点处理中文时特别重要。

字面量与转义

px
var a = "双引号字符串"
var b = '单引号也可以'
print(a)
print(b)
print("换行\n制表\t结束")
text
双引号字符串
单引号也可以
换行
制表	结束

常用转义:\n 换行、\t 制表、\" 引号、\\ 反斜杠。字符串里出现 \ 时注意它是转义起点。

长度与索引

px
var s = "普贤abc"
print(str(len(s)))
print(s[0:1])
print(s[2:3])
print(s[2:5])
text
5
普
a
abc

len() 数的是字符数(5),不是字节数(8)。切片是左闭右开:s[2:5] 取第 2、3、4 个字符。

切片技巧

px
var s = "abcdef"
print(s[0:3])
print(s[3:])
print(s[-2:])
print(s[0:len(s) - 1])
text
abc
def
ef
abcde

查找

px
var s = "hello world"
print(str(s.find("world")))
print(str(s.find("zzz")))
print(str(contains(s, "lo w")))
text
6
-1
true

find 返回首次出现的下标,找不到返回 -1;只要判断"有没有"用 contains 更直接。

拆分与拼接

px
var line = "2026-11-05,晨曦,QA"
var cols = split(line, ",")
print(str(len(cols)))
print(cols[0])
print(join(" | ", cols))
text
3
2026-11-05
2026-11-05 | 晨曦 | QA
join 的参数顺序是 join(分隔符, 列表),不是别的语言那种 list.join(sep)。写反了会得到「join 分隔符需要 string」。

拆分多行文本:

px
var text = "第一行\n第二行\n第三行"
var lines = split(text, "\n")
print(str(len(lines)))
for l in lines:
    print("· " + l)
text
3
· 第一行
· 第二行
· 第三行

大小写与空白

px
var s = "  Hello PuXian  "
print("[" + trim(s) + "]")
print(to_upper(s))
print(to_lower(s))
text
[Hello PuXian]
  HELLO PUXIAN  
  hello puxian  
没有 upper / lower函数名是 to_upper / to_lower。trim 只去首尾空白,中间的空白保留。

替换

px
var tpl = "你好,{name}!今天 {name} 值班。"
print(replace(tpl, "{name}", "晨曦"))
text
你好,晨曦!今天 晨曦 值班。

replace 替换全部出现位置。要做"只替换第一次",先用 find 定位再手工拼接。

重复与拼接

px
print("ab" * 3)
print("-" * 20)
var parts = ["a", "b", "c"]
var s = ""
for p in parts:
    s += p
print(s)
text
ababab
--------------------
abc
循环里拼字符串字符串每次 += 都是一次复制。几百次没问题;拼接上万段时先 append 到列表再 join,差别是几十毫秒和几秒的差别。

逐字符处理

px
def reverse(s):
    var out = ""
    var i = len(s) - 1
    while i >= 0:
        out += s[i:i + 1]
        i -= 1
    return out

print(reverse("普贤语言"))
text
言语贤普

常见错误

写法结果
"x" + 1R1002 无法相加: string + int
join(["a","b"], "-")R1002 join 分隔符需要 string
s[10:12](越界)返回空串,不报错
int("abc")R1002 无法将 'abc' 转为 int

大小写只对 ASCII 生效

to_upper / to_lower 是 ASCII-onlyto_upper("äöü abc") 得到 äöü ABC——非 ASCII 字母原样不动。Go 的 strings.ToUpper 会给出 ÄÖÜ ABC。registry/strcase 包也只做 ASCII,需要 Unicode 大小写时得自己建映射表。
px
print(to_upper("äöü abc"))     # äöü ABC
print(to_lower("ÄÖÜ ABC"))     # ÄÖÜ abc

同理,len(s) 返回的是字符数不是字节数(len("中文") = 2);要字节数用 bytes_len(bytes(s))。