CQL 教程/数据类型/字符串

字符串

学习 CQL 字符串的创建、拼接、格式化、索引切片与丰富的字符串方法,包括完整的中文方法名别名。

11.1字符串创建

字符串可以用单引号、双引号或三引号创建。单引号与双引号完全等价;三引号可以跨行,常用于长文本与文档字符串。

cql
# 三种创建方式
单引号 = '你好'
双引号 = "CQL"
三引号 = """第一行
第二行"""
打印(单引号, 双引号)
打印(三引号)
提示:文档字符串(三引号)会被原样保留到编译产物中;# 注释则会在词法阶段被忽略,不会出现在编译产物里。

11.2字符串拼接与重复

使用 + 拼接字符串、* 重复字符串。需要格式化时使用内置函数 格式化(Python str.format 语义,双目标输出逐行一致)。

cql
# 拼接与重复
问候 = "你好" + "," + "世界"
打印(问候)          # 你好,世界
打印("哈" * 3)      # 哈哈哈

格式化 支持位置占位{}{0}{1},含下标与属性访问)与具名占位{名称} 关键字参数):

cql
# 位置占位与具名占位
打印(格式化("{} 今年 {} 岁", "小明", 18))
打印(格式化("{0} 和 {1},还有 {0}", "甲", "乙"))
打印(格式化("{名称}:{分数} 分", 名称="小李", 分数=95))
打印(格式化("{0[键]}", {"键": "值"}))   # 占位符内下标访问

{!r} 调用 repr 转换、{{ }} 转义输出花括号本身:

cql
# 转换与转义
打印(格式化("{!r}", "文本"))        # '文本'(repr 带引号)
打印(格式化("{!s}", 42))            # 42(str 转换)
打印(格式化("{{花括号}}", ))        # {花括号}({{ }} 转义)

格式说明符支持对齐、零填充、符号、进制、千分位与精度,完整形式为 [[填充]对齐][符号][#][0][宽度][,][.精度][类型]

cql
# 格式说明符
打印(格式化("{:>10}|", "右对齐"))   # 宽度 10 右对齐
打印(格式化("{:<10}|", "左对齐"))   # 左对齐
打印(格式化("{:^10}", "居中"))      # 居中
打印(格式化("{:05d}", 42))          # 零填充 -> 00042
打印(格式化("{:#x}", 255))          # 十六进制带前缀 -> 0xff
打印(格式化("{:o}", 8))             # 八进制 -> 10
打印(格式化("{:,}", 1234567))       # 千分位 -> 1,234,567
打印(格式化("{:.2f}", 3.14159))     # 精度 -> 3.14
打印(格式化("{:.3}", 3.14159))      # 总位数 -> 3.14

11.3索引与切片

字符串与列表一样支持索引与切片,同样支持负索引与步长:

cql
# 索引与切片
文本 = "CQL 中文编程"
打印(文本[0])      # C
打印(文本[-1])     # 程(负索引从末尾倒数)
打印(文本[4:6])    # 中文(切片)
打印(文本[::-1])   # 程编文文中 LQC(反转)

11.4常用字符串方法

CQL 字符串方法沿用 Python 风格的名字,功能与 Python 完全一致:

cql
# Python 风格字符串方法
打印("  你好  ".strip())        # 去空白 -> 你好
打印("abc".upper())             # 大写 -> ABC
打印("ABC".lower())             # 小写 -> abc
打印("a,b,c".split(","))        # 分割 -> ['a', 'b', 'c']
打印("-".join(["1", "2", "3"])) # 连接 -> 1-2-3
打印("hello".replace("l", "L")) # 替换 -> heLLo
打印("hello".find("ll"))        # 查找 -> 2
打印("hello".startswith("he"))  # 前缀判断 -> 真
打印("hello".endswith("lo"))    # 后缀判断 -> 真

11.5中文方法名别名

CQL 为字符串方法提供了两批共 22 个中文方法名,Python 与 JavaScript 两个目标都会自动转译。第一批 12 个:

中文方法名等价 Python 方法中文方法名等价 Python 方法
居中center左填充ljust
右填充rjust首字母大写capitalize
每个词大写title左去空白lstrip
右去空白rstrip是否数字isdigit
是否字母isalpha是否空白isspace
删除前缀removeprefix删除后缀removesuffix

第二批 10 个:

中文方法名等价 Python 方法中文方法名等价 Python 方法
大小写切换swapcase分区partition
右分区rpartition行分割splitlines
零填充zfill出现次数count
右查找rfind是否数字字母isalnum
是否大写isupper是否小写islower
cql
# 中文方法名别名(第一批)
打印("ab".居中(5, "_"))         # 等价于 "ab".center(5, "_") -> "__ab_"
打印("aBC".首字母大写())         # 等价于 "aBC".capitalize() -> "Abc"
打印("hi there".每个词大写())    # 等价于 "hi there".title() -> "Hi There"
打印("  x".左去空白())           # 等价于 "  x".lstrip() -> "x"
打印("x  ".右去空白())           # 等价于 "x  ".rstrip() -> "x"
打印("123".是否数字())           # 等价于 "123".isdigit() -> 真
打印("abc".是否字母())           # 等价于 "abc".isalpha() -> 真
打印(" \t".是否空白())           # 等价于 " \t".isspace() -> 真
打印("pre_x".删除前缀("pre_"))   # 等价于 "pre_x".removeprefix("pre_") -> "x"
打印("x_suf".删除后缀("_suf"))   # 等价于 "x_suf".removesuffix("_suf") -> "x"
cql
# 中文方法名别名(第二批)
打印("Hello World".大小写切换())  # 等价于 "Hello World".swapcase() -> "hELLO wORLD"
打印("ab-cd".分区("-"))           # 等价于 "ab-cd".partition("-") -> ("ab", "-", "cd")
打印("ab-cd".右分区("-"))         # 等价于 "ab-cd".rpartition("-") -> ("ab", "-", "cd")
打印("a\nb".行分割())             # 等价于 "a\nb".splitlines() -> ["a", "b"]
打印("42".零填充(5))              # 等价于 "42".zfill(5) -> "00042"
打印("abab".出现次数("ab"))       # 等价于 "abab".count("ab") -> 2
打印("abcabc".右查找("ab"))       # 等价于 "abcabc".rfind("ab") -> 3
打印("a1".是否数字字母())         # 等价于 "a1".isalnum() -> 真
打印("ABC".是否大写())            # 等价于 "ABC".isupper() -> 真
打印("abc".是否小写())            # 等价于 "abc".islower() -> 真
提示:Python 目标编译为原生方法调用(.swapcase().partition() 等),JS 目标改写为 字符串大小写切换(s)字符串分区(s, 分隔符) 等运行时函数,语义完全对齐。

11.6注意事项

注意:CQL 不支持 f-string(带 f 前缀的字符串)。需要格式化字符串时,请统一使用内置函数 格式化("{} {}", a, b),其语义与 Python str.format 完全一致,且在 Python 与 JavaScript 双目标下输出逐行相同。