App Inventor 2 字符串操作教程 - 拆分、截取与高级文本处理

« 返回首页

概述

已有文档: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扩展 高级场景
文档反馈