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

« 返回首页

概述

已有文档reference/blocks/text.md 介绍了文本积木块。本文以实战场景为主,特别是”按空格拆分字符串”等常见需求。

核心文本操作

按空格拆分字符串

当 按钮_拆分.被点击
  设 原文 = "Hello World App Inventor 2"
  设 结果 = 分割文本(原文, " ")
  ' 结果 = ["Hello", "World", "App", "Inventor", "2"]
  
  设 显示 = ""
  设 i = 1
  当 i ≤ 列表长度(结果)
    设 显示 = 显示 & "第" & i & "个:" & 列表第i项(结果) & "\n"
    设 i = i + 1
  标签_结果.文本 = 显示

处理多个空格

' "Hello  World   App" 中有连续空格
' 先替换连续空格为单空格
设 文本 = "Hello  World   App"
设 清理后 = 替换文本(文本, "  ", " ")  ' 替换双空格
设 清理后 = 替换文本(清理后, "  ", " ")  ' 再替换一次
设 结果 = 分割文本(清理后, " ")

按多种分隔符拆分

' 按 "逗号" 或 "分号" 或 "空格" 拆分
设 文本 = "苹果,香蕉 橙子;葡萄"
设 步骤1 = 分割文本(文本, ",")     ' ["苹果", "香蕉 橙子;葡萄"]
设 步骤2 = 创建空列表
设 i = 1
当 i ≤ 列表长度(步骤1)
  设 子列表 = 分割文本(列表第i项(步骤1), " ")
  设 j = 1
  当 j ≤ 列表长度(子列表)
    设 子子列表 = 分割文本(列表第j项(子列表), ";")
    设 k = 1
    当 k ≤ 列表长度(子子列表)
      设 步骤2 = 添加列表项(步骤2, 列表第k项(子子列表))
      设 k = k + 1
    设 j = j + 1
  设 i = i + 1
' 步骤2 = ["苹果", "香蕉", "橙子", "葡萄"]

字符串截取

设 文本 = "Hello World"

设 前5个 = 文本开始到(文本, 5)          ' "Hello"
设 后5个 = 文本从开始(文本, 7)           ' "World"
设 中间 = 文本截取(文本, 2, 4)           ' 从第2位取4个字符
设 长度 = 文本长度(文本)                 ' 11

提取文件扩展名

定义 获取扩展名(文件名) 返回 扩展名
  设 位置 = 最后一次出现(文件名, ".")
  如果 位置 > 0
    返回 文本从开始(文件名, 位置 + 1)
  返回 ""

提取URL参数

定义 解析URL参数(网址) 返回 参数字典
  设 参数部分 = 替换文本(从字典(网址参数)获取"query", "?", "")
  设 对列表 = 分割文本(参数部分, "&")
  设 结果 = 创建字典()
  设 i = 1
  当 i ≤ 列表长度(对列表)
    设 键值 = 分割文本(列表第i项(对列表), "=")
    如果 列表长度(键值) = 2
      设 结果 = 设字典值(结果, 列表第1项(键值), 列表第2项(键值))
    设 i = i + 1
  返回 结果

字符串查找与替换

统计某个字符出现次数

定义 统计出现次数(文本, 目标) 返回 次数
  设 源长度 = 文本长度(文本)
  设 去除后 = 替换文本(文本, 目标, "")
  设 去除长度 = 文本长度(去除后)
  返回 (源长度 - 去除长度) / 文本长度(目标)

判断是否为数字

定义 是否为数字(文本) 返回 布尔值
  设 数字字符 = "0123456789.-"
  设 i = 1
  当 i ≤ 文本长度(文本)
    设 字符 = 文本第i个字符(文本)
    如果 非 (数字字符 包含 字符)
      返回 false
    设 i = i + 1
  返回 true

高级:正则表达式

已有 extensions/Regex扩展(kevinkun.cn),可以更灵活地处理字符串:

' 用正则表达式按空白字符拆分
设 结果 = 调用 Regex1.分割("Hello  World\tApp\nInventor", "\s+")
' 结果 = ["Hello", "World", "App", "Inventor"]

' 提取所有数字
设 结果 = 调用 Regex1.匹配全部("我有3个苹果和5个橘子", "\d+")
' 结果 = ["3", "5"]

' 验证手机号
设 是否有效 = 调用 Regex1.是否匹配("13800138000", "^1[3-9]\d{9}$")

常见问题

Q1: 分割后有空字符串元素?

设 结果 = 分割文本("a,,b,,c", ",")
' 结果 = ["a", "", "b", "", "c"]

' 过滤空元素
设 过滤后 = 创建空列表
设 i = 1
当 i ≤ 列表长度(结果)
  如果 列表第i项(结果) ≠ ""
    设 过滤后 = 添加列表项(过滤后, 列表第i项(结果))
  设 i = i + 1

Q2: 如何反转字符串?

定义 反转字符串(文本) 返回 结果
  设 结果 = ""
  设 i = 文本长度(文本)
  当 i ≥ 1
    设 结果 = 结果 & 文本第i个字符(文本)
    设 i = i - 1
  返回 结果

总结

操作 积木块 说明
按分隔符拆分 分割文本(文本, 分隔符) 最常用
截取前N个 文本开始到(文本, N) 取前缀
从第N位取 文本从开始(文本, N) 取后缀
替换 替换文本(文本, 旧, 新) 替换一次
查找位置 第一次出现 / 最后一次出现 定位
正则匹配 Regex扩展 高级场景

版权声明:MIT App Inventor 官方文档采用 CC BY-SA 4.0 授权,本文档由 ai2claw 🐝 整理。

文档反馈