概述
已有文档:reference/blocks/text.md 介绍了文本积木块。本文以实战场景为主,特别是”按空格拆分字符串”等常见需求。
核心文本操作
按空格拆分字符串
when 按钮_拆分.Click() {
var 原文 = "Hello World App Inventor 2"
var 结果 = split(原文, " ")
// 结果 = ["Hello", "World", "App", "Inventor", "2"]
var 显示 = ""
var i = 1
while i <= length(结果) {
显示 = join(显示, "第", i, "个:", 结果[i], "\n")
i = i + 1
}
标签_结果.Text = 显示
}
处理多个空格
// "Hello World App" 中有连续空格
// 先替换连续空格为单空格
global 文本 = "Hello World App"
global 清理后 = replaceall(文本, " ", " ") // 替换双空格
global 清理后 = replaceall(清理后, " ", " ") // 再替换一次
global 结果 = split(清理后, " ")
按多种分隔符拆分
// 按 "逗号" 或 "分号" 或 "空格" 拆分
global 文本 = "苹果,香蕉 橙子;葡萄"
global 步骤1 = split(文本, ",") // ["苹果", "香蕉 橙子;葡萄"]
global 步骤2 = []
global i = 1
while i <= length(步骤1) {
var item1 = 步骤1[i]
var 子列表 = split(item1, " ")
var j = 1
while j <= length(子列表) {
var item2 = 子列表[j]
var 子子列表 = split(item2, ";")
var k = 1
while k <= length(子子列表) {
var item3 = 子子列表[k]
listAdd(步骤2, item3)
k = k + 1
}
j = j + 1
}
i = i + 1
}
// 步骤2 = ["苹果", "香蕉", "橙子", "葡萄"]
字符串截取
global 文本 = "Hello World"
global 前5个 = segment(文本, 1, 5) // "Hello"
global 后5个 = substring(文本, 7) // "World"
global 中间 = segment(文本, 2, 4) // 从第2位取4个字符
global 长度 = length(文本) // 11
提取文件扩展名
function 获取扩展名(文件名) {
var 段列表 = split(文件名, ".")
return choose(length(段列表) > 1, 段列表[length(段列表)], "")
}
按 . 拆开后取最后一段就是扩展名(多级扩展名如 archive.tar.gz 取到 gz,与「最后一次出现」语义一致);文件名里没有 . 时拆出来只有一段,返回空文本。
提取URL参数
function 解析URL参数(网址参数) {
var 参数部分 = replaceall(dictLookup(网址参数, "query", ""), "?", "")
var 对列表 = split(参数部分, "&")
var 结果 = {}
var i = 1
while i <= length(对列表) {
var item = 对列表[i]
var 键值 = split(item, "=")
if length(键值) == 2 {
var k = 键值[1]
var v = 键值[2]
dictSet(结果, k, v)
}
i = i + 1
}
return 结果
}
字符串查找与替换
统计某个字符出现次数
function 统计出现次数(文本, 目标) {
var 源长度 = length(文本)
var 去除后 = replaceall(文本, 目标, "")
var 去除长度 = length(去除后)
var 次数 = (源长度 - 去除长度) / length(目标)
return 次数
}
判断是否为数字
function 是否为数字(文本) {
var isNum = true
var 数字字符 = "0123456789.-"
var i = 1
while i <= length(文本) {
var 字符 = substring(文本, i, 1)
if not textContains(数字字符, 字符) {
isNum = false
}
i = i + 1
}
return isNum
}
高级:正则表达式
已有 extensions/Regex扩展(kevinkun.cn),可以更灵活地处理字符串:
// 用正则表达式按空白字符拆分
global 结果 = Regex1.分割("Hello World\tApp\nInventor", "\s+")
// 结果 = ["Hello", "World", "App", "Inventor"]
// 提取所有数字
global 结果 = Regex1.匹配全部("我有3个苹果和5个橘子", "\d+")
// 结果 = ["3", "5"]
// 验证手机号
global 是否有效 = Regex1.是否匹配("13800138000", "^1[3-9]\d{9}$")
常见问题
Q1: 分割后有空字符串元素?
global 结果 = split("a,,b,,c", ",")
// 结果 = ["a", "", "b", "", "c"]
// 过滤空元素
global 过滤后 = []
global i = 1
while i <= length(结果) {
var item = 结果[i]
if item != "" {
listAdd(过滤后, item)
}
i = i + 1
}
Q2: 如何反转字符串?
```ai-blocks function 反转字符串(文本) { var 结果 = “” var i = length(文本) while i >= 1 { var c = substring(文本, i, 1) 结果 = 结果 + c i = i - 1 } return 结果 }
总结
| 操作 | 积木块 | 说明 |
|---|---|---|
| 按分隔符拆分 | 分割文本(文本, 分隔符) | 最常用 |
| 截取前N个 | 文本开始到(文本, N) | 取前缀 |
| 从第N位取 | 文本从开始(文本, N) | 取后缀 |
| 替换 | 替换文本(文本, 旧, 新) | 替换一次 |
| 查找位置 | 第一次出现 / 最后一次出现 | 定位 |
| 正则匹配 | Regex扩展 | 高级场景 |
扫码添加客服咨询