回复
HarmonyOS字符串处理实战:从插值到正则的全攻略 原创
SameX
发布于 2025-6-27 13:23
浏览
0收藏
作为在鸿蒙开发中处理过海量文本的老开发,曾因字符串编码问题导致国际化应用乱码,也被正则性能坑过。本文结合实战经验,分享仓颉语言字符串处理的核心技巧,帮你避开常见陷阱。
一、字符串字面量的三种形态
1.1 字面量类型与转义规则
| 类型 | 定义方式 | 转义规则 | 典型场景 |
|---|---|---|---|
| 单行字符串 | ""或'' |
支持\n、\"等转义 |
短文本、标签 |
| 多行字符串 | """或''' |
保留原始换行 | SQL语句、HTML片段 |
| 原始字符串 | #"..."# |
不处理转义字符 | 正则表达式、路径字符串 |
1.2 实战选择指南
// 单行字符串(短文本)
let title = "HarmonyOS"
// 多行字符串(SQL语句)
let sql = """
SELECT * FROM users
WHERE age > 18
"""
// 原始字符串(正则表达式)
let regex = #"\d{4}-\d{2}-\d{2}"# // 匹配日期
二、字符串插值的艺术
2.1 基础插值语法
let name = "张三"
let age = 28
let info = "用户 \(name) 年龄 \(age) 岁" // "用户 张三 年龄 28 岁"
// 表达式插值
let result = "计算结果: \(10 * 2 + 5)" // "计算结果: 25"
2.2 格式化插值
let price = 19.99
let date = Date()
// 数字格式化
let priceStr = "价格: ¥\(price, .fixed(2))" // "价格: ¥19.99"
// 日期格式化
let dateStr = "日期: \(date, .dateTime.short)" // "日期: 2023/10/15"
2.3 多行插值技巧
let user = User(name: "李四", email: "lisi@example.com")
let profile = """
用户信息:
姓名: \(user.name)
邮箱: \(user.email)
"""
三、Unicode处理的核心技巧
3.1 字符与编码处理
let str = "你好,Hello!"
// UTF-8字节遍历
for byte in str.utf8 {
print("\(byte) ") // 输出UTF-8字节序列
}
// UTF-16代码单元遍历
for unit in str.utf16 {
print("\(unit) ") // 输出UTF-16代码单元
}
// 获取Unicode标量
for scalar in str.unicodeScalars {
print("\(scalar.value) ") // 输出Unicode码点
}
3.2 国际化文本处理
// 字符串规范化
let normalized = "Café".normalized(to: .nfkd) // 处理变音符号
// 语言敏感比较
let compareOptions = CompareOptions()
compareOptions.locale = "fr" // 法语比较规则
let result = "Château".compare("Chateau", options: compareOptions)
四、正则表达式实战
4.1 基础匹配语法
import std.regex.*
// 匹配邮箱地址
let emailRegex = Regex("[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}")
let email = "user@example.com"
if emailRegex.match(email) {
print("有效邮箱")
}
// 匹配手机号(中国)
let phoneRegex = Regex("1[3-9]\\d{9}")
4.2 捕获组与分组
// 提取URL中的域名
let urlRegex = Regex("https?://(\\w+\\.\\w+)/.*")
let url = "https://harmonyos.com/docs"
if let match = urlRegex.match(url) {
let domain = match.group(1) // "harmonyos.com"
}
// 匹配HTML标签
let htmlRegex = Regex("<(\\w+)>(.*?)</\\1>")
let html = "<div>内容</div>"
let matches = htmlRegex.findAll(html)
4.3 正则性能优化
// 预编译正则(提升多次匹配性能)
let regex = Regex.compile("#\\d+") // 预编译匹配#123形式的标签
// 惰性匹配(避免贪婪匹配)
let lazyRegex = Regex("<div.*?>.*?</div>") // 非贪婪匹配
五、实战避坑指南
5.1 字符串操作陷阱
- 不可变性注意:
-
- let str = “Hello”
- // str += " World" // 错误:字符串不可变
- let newStr = str + " World" // 正确:创建新字符串
-
- 编码转换风险:
-
- // 反例:未指定编码导致乱码
- let data = “中文”.toByteArray()
- let str = String(data: data) // 可能乱码
// 正例:指定UTF-8编码
let str = String(data: data, encoding: .utf8)
### 5.2 正则表达式陷阱
1. **贪婪匹配问题**:
2. ```cj
3. // 反例:贪婪匹配导致错误
4. let regex = Regex("<div>.*</div>") // 匹配第一个<div>到最后一个</div>
// 正例:惰性匹配
let regex = Regex("<div>.*?</div>") // 匹配最近的</div>
- 性能优化:
-
- // 反例:重复编译正则
- for item in list {
-
Regex("pattern").match(item) // 每次都编译 - }
// 正例:预编译正则
let regex = Regex(“pattern”)
for item in list {
regex.match(item)
}
## 六、总结:字符串处理的最佳实践
1. **字面量选择**:短文本用单行,多行文本用三引号,正则用原始字符串
2. 2. **插值技巧**:复杂表达式用括号包裹,格式化用`.fixed`、`.scientific`等修饰符
3. 3. **Unicode处理**:遍历用`unicodeScalars`,国际化用`CompareOptions`
4. 4. **正则优化**:预编译常用正则,用惰性匹配避免性能问题
5.
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
标签
赞
收藏
回复
相关推荐




















