浮生A梦 发表于 2025-7-16 20:27:04

【浮生梦】第九期 第二课 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))--&gt; &quot;table&quot;
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(&quot;A&quot;))--&gt; 65
print(string.byte(&quot;ABC&quot;, 1, 3))--&gt; 65 66 67
</code></pre>
</li>
<li>​**<code>string.char(...)</code>**​<br />
将ASCII码转字符
<pre><code>print(string.char(65))--&gt; &quot;A&quot;
</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 = &quot;hello123&quot;
print(string.find(s, &quot;l&quot;))      --&gt; 3 3
print(string.find(s, &quot;%d+&quot;))   --&gt; 6 8(匹配数字)
print(string.find(s, &quot;l&quot;, 4))--&gt; 4 4(从第4位开始找)
</code></pre>
</li>
<li>​<strong>语法糖形式</strong>​
<pre><code>s:find(&quot;l&quot;)-- 等价于 string.find(s, &quot;l&quot;)
</code></pre>
</li>
</ul>
<h5>​<strong>​(3) 字符串匹配</strong>​</h5>
<ul>
<li>​**<code>string.match(s, pattern, )</code>**​<br />
直接返回匹配内容(非位置)
<pre><code>print(string.match(&quot;name: Alice&quot;, &quot;(%a+):%s*(%a+)&quot;))--&gt; &quot;name&quot;, &quot;Alice&quot;
</code></pre>
</li>
<li>​**<code>string.gmatch(s, pattern)</code>**​<br />
返回迭代器,用于遍历所有匹配
<pre><code>for word in (&quot;hello world&quot;):gmatch(&quot;%a+&quot;) do
print(word)--&gt; &quot;hello&quot;, &quot;world&quot;
end
</code></pre>
</li>
</ul>
<h5>​<strong>​(4) 字符串格式化</strong>​</h5>
<ul>
<li>​**<code>string.format(format, ...)</code>**​<br />
使用占位符格式化字符串
<pre><code>local name, age = &quot;Bob&quot;, 25
print(string.format(&quot;Name: %s, Age: %d&quot;, 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(&quot;Lua is cute&quot;, &quot;cute&quot;, &quot;awesome&quot;))--&gt; &quot;Lua is awesome&quot;
</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>&quot;a&quot;</code>,<code>&quot;Z&quot;</code></td>
</tr>
<tr>
<td><code>%d</code></td>
<td>任意数字</td>
<td><code>&quot;0&quot;</code>,<code>&quot;9&quot;</code></td>
</tr>
<tr>
<td><code>%s</code></td>
<td>空白字符(空格/制表符)</td>
<td><code>&quot; &quot;</code>,<code>&quot;\t&quot;</code></td>
</tr>
<tr>
<td><code>%w</code></td>
<td>字母或数字</td>
<td><code>&quot;a&quot;</code>,<code>&quot;1&quot;</code></td>
</tr>
<tr>
<td><code>%x</code></td>
<td>十六进制数字</td>
<td><code>&quot;A&quot;</code>,<code>&quot;f&quot;</code></td>
</tr>
<tr>
<td><code>+</code></td>
<td>重复1次或多次</td>
<td><code>&quot;%d+&quot;</code>匹配连续数字</td>
</tr>
<tr>
<td><code>*</code></td>
<td>重复0次或多次</td>
<td><code>&quot;%a*&quot;</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>&quot;50%%&quot;</code>输出&quot;50%&quot;)。</li>
</ol>
<hr />
<h4>​<strong>5. 实战案例</strong>​</h4>
<pre><code>-- 提取URL中的域名
local url = &quot;https://www.example.com/path&quot;
local domain = url:match(&quot;https?://([%w-.]+)&quot;)
print(domain)--&gt; &quot;www.example.com&quot;

-- 格式化表格数据
local data = {{&quot;Alice&quot;, 90}, {&quot;Bob&quot;, 85}}
for _, v in ipairs(data) do
print(string.format(&quot;%-10s | %03d&quot;, v, v))
end
-- 输出:
-- Alice      | 090
-- Bob      | 085
</code></pre>
<hr />
<p>掌握这些核心函数后,可高效处理字符串拼接、数据提取、格式化输出等常见需求!</p>

飓风_Ai 发表于 2025-7-16 20:27:04

哇塞!看来你正在认真学习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]
查看完整版本: 【浮生梦】第九期 第二课 Lua字符串库(string) 匹配和占位符