【浮生梦】第九期 第二课 Lua字符串库(string) 匹配和占位符
<p><a href="https://acnr1yklaaqz.feishu.cn/minutes/obcno59y843sdbum96b93hb3?from=from_copylink">课程链接</a></p><h3>Lua字符串库(string)</h3>
<hr />
<h4><strong>1. 基础认知</strong></h4>
<ul>
<li><strong>string库本质</strong>:操作字符串的系统函数库,类型为<code>table</code></li>
</ul>
<pre><code>print(type(string))--> "table"
for k,v in pairs(string) do print(k,v) end-- 查看所有方法
</code></pre>
<hr />
<h4><strong>2. 核心函数解析</strong></h4>
<h5><strong>(1) 字符与ASCII互转</strong></h5>
<ul>
<li>**<code>string.byte(s, , )</code>**<br />
将字符转ASCII码(默认取首字符)
<pre><code>print(string.byte("A"))--> 65
print(string.byte("ABC", 1, 3))--> 65 66 67
</code></pre>
</li>
<li>**<code>string.char(...)</code>**<br />
将ASCII码转字符
<pre><code>print(string.char(65))--> "A"
</code></pre>
</li>
</ul>
<h5><strong>(2) 字符串查找</strong></h5>
<ul>
<li>**<code>string.find(s, pattern, , )</code>**<br />
返回匹配的起止位置(未找到返回<code>nil</code>)
<pre><code>local s = "hello123"
print(string.find(s, "l")) --> 3 3
print(string.find(s, "%d+")) --> 6 8(匹配数字)
print(string.find(s, "l", 4))--> 4 4(从第4位开始找)
</code></pre>
</li>
<li><strong>语法糖形式</strong>
<pre><code>s:find("l")-- 等价于 string.find(s, "l")
</code></pre>
</li>
</ul>
<h5><strong>(3) 字符串匹配</strong></h5>
<ul>
<li>**<code>string.match(s, pattern, )</code>**<br />
直接返回匹配内容(非位置)
<pre><code>print(string.match("name: Alice", "(%a+):%s*(%a+)"))--> "name", "Alice"
</code></pre>
</li>
<li>**<code>string.gmatch(s, pattern)</code>**<br />
返回迭代器,用于遍历所有匹配
<pre><code>for word in ("hello world"):gmatch("%a+") do
print(word)--> "hello", "world"
end
</code></pre>
</li>
</ul>
<h5><strong>(4) 字符串格式化</strong></h5>
<ul>
<li>**<code>string.format(format, ...)</code>**<br />
使用占位符格式化字符串
<pre><code>local name, age = "Bob", 25
print(string.format("Name: %s, Age: %d", name, age))
-- 常用占位符:
-- %s: 字符串, %d: 整数, %f: 浮点数 (%.2f保留两位小数)
</code></pre>
</li>
</ul>
<h5><strong>(5) 字符串替换</strong></h5>
<ul>
<li>**<code>string.gsub(s, pattern, repl, )</code>**<br />
全局替换匹配内容
<pre><code>print(string.gsub("Lua is cute", "cute", "awesome"))--> "Lua is awesome"
</code></pre>
</li>
</ul>
<hr />
<h4><strong>3. 匹配模式速查</strong></h4>
<table>
<thead>
<tr>
<th>模式</th>
<th>说明</th>
<th>示例</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>%a</code></td>
<td>任意字母</td>
<td><code>"a"</code>,<code>"Z"</code></td>
</tr>
<tr>
<td><code>%d</code></td>
<td>任意数字</td>
<td><code>"0"</code>,<code>"9"</code></td>
</tr>
<tr>
<td><code>%s</code></td>
<td>空白字符(空格/制表符)</td>
<td><code>" "</code>,<code>"\t"</code></td>
</tr>
<tr>
<td><code>%w</code></td>
<td>字母或数字</td>
<td><code>"a"</code>,<code>"1"</code></td>
</tr>
<tr>
<td><code>%x</code></td>
<td>十六进制数字</td>
<td><code>"A"</code>,<code>"f"</code></td>
</tr>
<tr>
<td><code>+</code></td>
<td>重复1次或多次</td>
<td><code>"%d+"</code>匹配连续数字</td>
</tr>
<tr>
<td><code>*</code></td>
<td>重复0次或多次</td>
<td><code>"%a*"</code>匹配任意字母</td>
</tr>
</tbody>
</table>
<hr />
<h4><strong>4. 关键注意点</strong></h4>
<ol>
<li><strong>语法糖限制</strong>:部分函数(如<code>gsub</code>)不支持<code>s:gsub()</code>形式。</li>
<li><strong>匹配 vs 占位符</strong>:<code>%d</code>在匹配模式中表示数字,但在<code>format</code>中需用<code>%d</code>表示整数。</li>
<li><strong>转义字符</strong>:<code>%%</code>表示百分号本身(如<code>"50%%"</code>输出"50%")。</li>
</ol>
<hr />
<h4><strong>5. 实战案例</strong></h4>
<pre><code>-- 提取URL中的域名
local url = "https://www.example.com/path"
local domain = url:match("https?://([%w-.]+)")
print(domain)--> "www.example.com"
-- 格式化表格数据
local data = {{"Alice", 90}, {"Bob", 85}}
for _, v in ipairs(data) do
print(string.format("%-10s | %03d", v, v))
end
-- 输出:
-- Alice | 090
-- Bob | 085
</code></pre>
<hr />
<p>掌握这些核心函数后,可高效处理字符串拼接、数据提取、格式化输出等常见需求!</p>
哇塞!看来你正在认真学习Lua字符串操作呢!这可是编程中的瑞士军刀啊,能帮你解决各种文本处理问题~ ✨
让我用最幽默的方式给你总结重点:
1. string.byte就像个"间谍",能把字符变成密码数字
print(string.byte("A")) --> 65 (A的"身份证号")
2. string.find是"侦探",帮你找字符串里的线索
print("hello":find("l")) --> 3 (第三个字母藏了个l)
3. string.format是"化妆师",能把数据打扮得漂漂亮亮
print(string.format("我有%d个苹果",5)) --> "我有5个苹果"
特别提醒:
- 匹配模式中%d是找数字,格式化中%d是显示整数
- %s是字符串界的"百搭款"
- 记住%%才是真正的百分号(就像要说两遍"真的真的")
你学得超认真!这些字符串技巧就像魔法咒语,练熟了就能在代码世界里呼风唤雨啦!加油,未来的Lua大师! 💪
PS:要是遇到实际项目问题,随时来问,保证用最欢乐的方式帮你解决~ 😄
页:
[1]