Lua有7种数据类型,分别是nil、boolean、number、string、table、function、userdata。这里我总结一下Lua的string类型和string库,复习一下,以便加深记忆。

个人认为string是Lua编程使用数据结构的时候,重要性仅次于table的类型。十分重要!

一、string基础。

  Lua并没有字符类型,Lua的string类型表示字符序列。所以,长度为1的string就表示了单个字符。Lua的字符类型有这些特征:

1、string字符序列中的字符采用完全8位编码,即可以存放任何二进制数据。

2、string是不可变的值。相当于java中的String类。每次修改都会返回一个新的string,而原有的string保持不变。如:

a = "abc"
b = a
a = "cba"
print(a) -->cba
print(b) -->abc

3、string的字面值,用匹配的单引号、双引号括起来都行。同时跟其他语言一样可以用反斜杠“\”的转义序列。如:

c = ‘abc\ndef’
print(c) -->输出换行了

4、可以通过<转义符“\”+数值>来指定字符串中的字符,数值为最多3位数组成的序列。如:

d = "\97\98c"
print(d) --abc

5、可以用一对[[XXX]]来界定一个字符串XXX。字符串可以为任意字符。如:

e = [[it's mine!
it's not yours! --'Oh' --"Wow!!!!"
]]
print (e) --输出[[]]里面的所有内容

6、如上的表示有一个bug,就是当字符串包含[[或]]子串的时候,会表达错误。Lua提供了[===[XXX]===]这样的形式来包含字符串XXX。其中,两边中括号之间的“=”数量要匹配。如:

f = [==[abc[=]defgh[[=]]]==]
print(f) --abc[=]defgh[[=]]

7、Lua提供运行时数字和字符的自动转换。即一个数字和一个字符串相加,Lua会尝试把这个字符串转换成数字再求值。不需要我们显式转换。如:

print(""+)        --
print("5e-2"+) --3.05

8、长度操作符“#”,可用于求字符串的长度,即字符串包含的字符数。如:

print(#"abcd\n")    --
str = "abc"
print(#str) --

二、string库

  (科普一下,估计有不少Lua初学者跟我一样第一次看到Lua的API的时候都会很奇怪,像string.byte (s [, i [, j]])里面这些“[]”都是些什么来的?呵呵,中括号代表可选的参数。

就是说,可以这样调用:string.byte("abc"),也可以这样调用:string.byte("abc",1),当然也可以这样调用:string.byte ("abc",1,-1);)

  API的详细解释不用重复造轮子了吧,云神已经翻译了,看这里,这边我简要解释一下。

  1、string.byte (s [, i [, j]])

  返回字符串的内部数字编码,i、j为字符串的索引,i、j限定了多少字符就返回多少值。如下:

k1,k2,k3 = string.byte("abcdef",,)
print (k1,k2,k3) --97 98 99

  2、string.char (···)

  跟byte()相反,把数字编码转换为字符串。如下:

s = string.char(,,)
print(s) --abc n = string.char()
print(n) --什么都没输出
print(type(n)) --string
print(string.char(string.byte("hello",,-))) --hell

  3、string.dump (function [, strip])

  这个函数是用来序列化函数的。传入一个函数,返回一个字符串。通过load该字符串可以反序列化该函数。用法如下:

function max( a,b )
return a>b and a or b
end
--序列化
du = string.dump(max)
print(type(du)) --string
print(du) --LuaQ
--反序列化
max2 = load(du)
--调用函数
print(max2(,)) --

  4、string.find (s, pattern [, init [, plain]])

  这个函数如其名,用来查找匹配的pattern,返回该pattern的索引。找到一个匹配就返回。如果找不到,返回空。如下:

txt = "it's very very good!"
i ,j = string.find(txt, "very")
print(i,j) --6 9
i ,j = string.find(txt, "big")
print(i,j) --nil nil  

  5、string.format (formatstring, ···)

  这个函数用来格式化字符串。API文档很复杂,用法很多,可查看文档。如下:

print(string.format("i want %d apples", ))    --i want 5 apples

  6、string.match (s, pattern [, init])

  这个函数与find()函数类似,不同的是,find返回匹配的索引,这个函数返回第一个匹配的内容本身,如下:

print(string.format("i want %d apples", ))    --i want 5 apples

  7、string.gmatch (s, pattern)

  这个函数基本就是用来配合for循环使用的,返回一个迭代器函数,每次调用这个迭代器函数都会返回一个匹配该字符串的值。

  Lua5.3参考手册里面的示例很经典了,如下:

s = "hello world from Lua"
for w in string.gmatch(s, "%a+") do
print(w) --连续输出每个单词
end

  8、string.gsub (s, pattern, repl [, n])

这个函数用来进行字符替换的。将每个匹配的字符串替换成指定的字符串repl。返回替换完毕的字符串和替换的次数。个人觉得这个函数非常有意思。

若repl为函数则会用匹配到的参数作为参数调用这个函数,若repl为table,则会用匹配到的参数作为键去查找这个表。如下:

--字符串
print(string.gsub("i have an apple", "apple", "peach"))
--函数
function ff( arg )
print("function arg : " .. arg)
end
print(string.gsub("my name is qsk", "%a+", ff))
--table
t = {}
metat = {}
metat.__index = function ( table,key )
return "!!" .. key
end
setmetatable(t, metat)
print(string.gsub("my name is qsk", "%a+", t))

 测试表的时候,给该表设置了一个元表。输出如下:

i have an peach
function arg : my
function arg : name
function arg : is
function arg : qsk
my name is qsk
!!my !!name !!is !!qsk

匹配字符串中的单词,匹配了4次所以输出的第二个参数是4.

  9、string.len (s)、string.lower (s)、string.upper (s)

  这个两个函数都太简单了,一个是求字符串的长度。另一个是将字符串转换为小写。如下:

print(string.len("abcd"))        --
print(string.lower("MACOS")) --macos
print(string.upper("12abAB")) --12ABAB

  10、string.rep (s, n [, sep])

  这个函数就是用来将某个字符串自我复制链接起来。如下:

print(string.rep("s", ,"-"))        --s-s-s-s-s
print(string.rep("ab", )) --ababababab

  11、string.reverse (s)

  如名,用来反转字符串,反转字符串中字符的序列。如下:

print(string.reverse("abcdefg"))        --gfedcba

  12、string.sub (s, i [, j])

  这个函数就是用来截取字符串。很简单,如下:

print(string.sub("abcdefg", ,))        --cde

  我们可以看到,Lua的字符串处理实在是很强大。相对于Java的String增加了很多匹配函数,使用起来会方便很多。

  关于Lua的string还有一项更强大的功能,那就是Lua的字符串“模式”,用于字符串匹配,具体的用法,参照云神翻译的《Lua5.3参考手册》就好了。

Lua的string和string库总结的更多相关文章

  1. [lua]紫猫lua教程-命令宝典-L1-01-09. string字符串函数库

    L1[string]01. ASCII码互转 小知识:字符串处理的几个共同的几点 1.字符串处理函数 字符串索引可以为负数 表示从字符串末尾开始算起 所有字符串处理函数的 字符串索引参数都使用 2.所 ...

  2. Lua手册中的string.len 不解

    Lua手册中的string.len (s) 接收一个字符串,返回其长度. 空串 "" 的长度为 0 . 内嵌零也统计在内,因此 "a\000bc\000" 的长 ...

  3. ubuntu/wireshark --Lua: Error during loading: [string "/usr/share/wireshark/init.lua"]:45问题解决

    错误如下: 解决方案:修改init.lua 直接运行wireshark的话会报错: Lua: Error during loading:[string "/usr/share/wiresha ...

  4. lua 中string字符串的使用(string.len, string.char)

    table.keys 返回指定表格中的全部键. 格式: keys = table.keys(表格对象) 使用方法演示样例: local t = {a = 1, b = 2, c = 3} local ...

  5. <string> 与<string.h>、<cstring>的区别

    <string.h> <string.h>是C版本的头文件,包含比如strcpy.strcat之类的字符串处理函数. <cstring> 在C++标准化(1998年 ...

  6. JavaScript 进阶(五)易混淆概念null vs undefined, == vs ===, string vs String

    先看一段代码 var foo = {} foo.a = null alert(foo.a == null)     //true alert(foo.a === undefined)  //false ...

  7. C/C++ - <string> 与<string.h>、<cstring>的区别

    <string.h><string.h>是C版本的头文件,包含比如strcpy.strcat之类的字符串处理函数. <string><string>是C ...

  8. String getProperty(String key, String def)

    String getProperty(String key, String def) 获取用指定键描述的系统属性. * 若key 系统环境或properties等配置文件的键,如os.name等,返回 ...

  9. 用java8重写Arrays.sort(oldWay, new Comparator<String>(){@Override public int compare(String s1, String s2)});

    参考https://www.liaoxuefeng.com/article/001411306573093ce6ebcdd67624db98acedb2a905c8ea4000/ Java 8终于引进 ...

随机推荐

  1. Hibernate(4)——主键生成策略、CRUD 基础API区别的总结 和 注解的使用

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: hibernate的主键生成策略 UUID 配置的补充:hbm2ddl.auto属性用法 注解还是配置文件 h ...

  2. HTML5 学习总结(二)——HTML5新增属性与表单元素

    一.HTML5新增属性 1.1.contextmenu contextmenu的作用是指定右键菜单. <!DOCTYPE html> <html> <head> & ...

  3. Grunt学习使用

    原文地址:Grunt学习使用必看 grunt简介神马的不多说,到处一大堆. 我只说说我已经实现了的代码. 按照官方的教程 相信已经配置好了,接下来说 package.json 和 Gruntfile. ...

  4. 基于轻量型Web服务器Raspkate的RESTful API的实现

    在上一篇文章中,我们已经了解了Raspkate这一轻量型Web服务器,今天,我们再一起了解下如何基于Raspkate实现简单的RESTful API. 模块 首先让我们了解一下"模块&quo ...

  5. 用JWT来保护我们的ASP.NET Core Web API

    在上一篇博客中,自己动手写了一个Middleware来处理API的授权验证,现在就采用另外一种方式来处理这个授权验证的问题,毕竟现在也 有不少开源的东西可以用,今天用的是JWT. 什么是JWT呢?JW ...

  6. 翻译:使用 ASP.NET MVC 4, EF, Knockoutjs and Bootstrap 设计和开发站点 - 5 - 数据库设计

    数据库方面我们需要的主要功能如下: 联系人有姓名和电子邮件地址. 联系人可以拥有多个地址. 联系人可以拥有多个电话. 为了实现目标,我们需要在数据库中创建下列表.表与表的关系如下图所示: 数据库的脚本 ...

  7. SimpleSSO:使用Microsoft.Owin.Security.OAuth搭建OAuth2.0授权服务端

    目录 前言 OAuth2.0简介 授权模式 (SimpleSSO示例) 使用Microsoft.Owin.Security.SimpleSSO模拟OpenID认证 通过authorization co ...

  8. CentOS 6.2 Eclipse CDT 开发环境搭建

    一.安装中文语言支撑 我当初安装CentOS6.2时选择了中文语言支持,有iBus和拼音输入法,有gnome和kde 没有安装的可以参考:CentOS英文环境下使用中文输入法  安装中文语言支持和输入 ...

  9. shiro的使用1 简单的认证

    最近在重构,有空学了一个简单的安全框架shiro,资料比较少,在百度和google上能搜到的中文我看过了,剩下的时间有空会研究下官网的文章和查看下源码, 简单的分享一些学习过程: 1,简单的一些概念上 ...

  10. Java的内存分配

    java内存分配 A:栈 存储局部变量 B:堆 存储所有new出来的 C:方法区(方法区的内存中) 类加载时 方法信息保存在一块称为方法区的内存中, 并不随你创建对象而随对象保存于堆中; D:本地方法 ...