lua_string

两大特点:

1. string库中所有的字符索引从前往后是1,2,...;从后往前是-1,-2,...

2. string库中所有的function都不会直接操作字符串,而是返回一个新的字符串。

库函数:

1、string.len,string.rep,string.upper,string.lower,string.sub,string.format

local str = "abc"

print(string.len(str)) --6

print(string.rep(str, 2^2)) --abcabcabcabc

print(string.upper(str)) --ABC

print(string.lower("ABC")) --abc

print(string.format("%02d/%02d/%04d", 5, 12, 2001))--05/12/2001

print(string.sub(str, 1, 2))--ab

截取字符串str的从第i个字符到第j个字符之间的串。

lua中,字符串的第一个字符索引从1开始,你也可以使用负值,不提供第三个参数,则默认为-1,

2、string.char,string.byte

local i=97

print(string.char(i))--a

print(string.char(i, i+1, i+2))--abc

print(string.byte("abc"))--97

print(string.byte("abc", 2))--98

print(string.byte("abc", -1))--99

string.char函数和string.byte函数用来处理字符和数字之间转换。

string.char获取0个或多个整数,将每一个数字转换成字符,然后返回一个所有这些字符连接起来的字符串。

string.byte(s,i)将字符串s的第i个字符的转换成整数,第二个参数可选,默认为1。

3、string.find

在目标串内搜索匹配指定的模式串。如果找到则返回对应的位置,否则返回nil。

local str = "hello world"

local i, j = string.find(str, "hello")

print(i, j) -- 1      5

print(string.find(str, "lll"))--nil

  string.find( )的第三个参数是可选的:标示目标串中搜索的起始位置。

查找目标串中某单次出现的次数:

local str = "hello Maria! hello Mical! hello Sam!"

local sum = 0

local idx = 0

repeat

idx = string.find(str, "hello", idx+1)

if idx then

sum = sum + 1

end

until idx == nil

print("sum: ", sum) -- 3

4、string.gsub

函数有四个参数:目标串,模式串,替换串,(可选:最多替换的个数)

返回替换后的字符串和替换的次数。

local str1 = "hello Maria! hello Mical! hello Sam!"

local str2, times1 = string.gsub(str1, "hello", "hi")

print( str2, times1) --hi Maria! hi Mical! hi Sam!3

local str3, times2 = string.gsub(str1, "hello", "hi", 2)

print( str3, times2) --hi Maria! hi Mical! hello Sam!2

string.gsub(s, pattern, func)

local strr = string.gsub(str1, "hello", function(s)

      return s.."_"

end)

print(strr)--hello_ Maria! hello_ Mical! hello_ Sam!

5、string.gfind(s, pattern)

返回一个迭代器,迭代器每执行一次,返回下一个匹配串;

iter = string.gfind("a=b c=d", "[^%s+]=[^%s+]")

print(iter()) -- a=b

print(iter()) -- c=d

通常用于泛性for循环,下面的例子结果同上

for s in string.gfind("a=b c=d", "[^%s+]=[^%s+]") do

print(s) -- a=b c=d

end

模式:

对lua而言,模式串就是普通的字符串,并不受特殊对待。

1、字符类

.            任意字符

%a        字母

%c         控制字符

%d        数字

%l         小写字母

%p        标点字符

%s         空白符

%u        大写字母

%w       字符和数字

%z         代表0的字符

上面字符类的大写形式表示小写所代表的集合的补集。例如,‘%A‘表示非字母的字符。print(string.gsub("hello world", "%A",
"_")) --hello_world 1

2、特殊字符

(     )      .      %    +     -      *     ?     [      ^     $

‘%‘用作特殊字符的转义字符,‘%.‘匹配点;‘%%‘匹配字符‘%‘。转义字符‘%‘不仅可以用来转义特殊字符,还可以用于所有的非字母的字符。当对一个字符有疑问的时候,为安全起见请使用转义字符转义它。

用‘[]‘创建字符集:(可以使用连字符‘-‘,在‘[]‘开始出使用‘^‘表示补集)

‘[%w_]‘  匹配数字字母和下划线,

‘[01]‘      匹配二进制数字,

‘[%[%]]‘  匹配方括号。

‘[0-9]‘     匹配0到9之间的数

‘[^0-7]‘   匹配不是0到7之间的字符

3、模式修饰符

+ 匹配前一字符1次或多次,最长匹配

* 匹配前一字符0次或多次,最长匹配

- 匹配前一字符0次或多次,最短匹配

? 匹配前一字符0次或1

‘+‘匹配一个或多个字符,总是进行最长匹配。

print(string.gsub("hello Sam.", "%a+",
"***")) --*** ***.2

‘*‘与‘+‘类似,但是它匹配一个字符0次或多次出现。

‘-‘与‘*‘一样,都匹配一个字符的0次或多次出现,但是它进行的是最短匹配。

print(string.gsub("(hello)world)", "%(.*%)",
"*")) --*1

print(string.gsub("(hello)world)", "%(.-%)",
"*")) --*world)1

以‘^‘开头的模式只匹配目标串的开始部分,以‘$‘结尾的模式只匹配目标串的结尾部分。

print(string.gsub("(hello)(world)", "%(.-%)",
"*")) --**2

print(string.gsub("(hello)(world)", "^%(.-%)",
"*")) --*(world)1

print(string.gsub("(hello)(world)", "%(.-%)$",
"*")) --*1

‘%b‘用来匹配对称的字符。常写为‘%bxy‘,x和y是任意两个不同的字符;x作为匹配的开始,y作为匹配的结束。

‘%b()‘    匹配以‘(‘开始,以‘)‘结束的字符串。

‘%b[]‘    ‘%b<>‘

时间: 2024-11-06 04:45:10

lua_string的相关文章

Lua1.0 代码分析 table.c

转载出处:http://my.oschina.net/xhan/blog/307961 table.c 代码分析 全局符号,常量,字符串,关联数组,文件列表的定义. 全局符号: 初始有 5 个基本的符号,Lua 预设的函数和库函数都注册在里面. 常量: 初始的几个常量是 Lua 中 type 的名字. 字符串表,关联数组表,文件列表 所有的这些在 table.c 中定义的这些数组可以认为是 Lua 的全局注册表空间,Lua 的环境. 函数分析 ? 1 2 3 4 5 6 7 8 9 10 11

Lua_第23章 C API 纵览

第23章 C  API 纵览 Lua是一个嵌入式的语言,意味着 Lua 不仅可以是一个独立运行的程序包也可以是一个用来嵌入其他应用的程序库.你可能觉得奇怪:如果 Lua 不只是独立的程序,为什么到目前为止贯穿整本书我们都是在使用 Lua 独立程序呢? 这个问题的答案在于 Lua 解释器(可执行的 lua).Lua解释器是一个使用 Lua 标准库实现的独立的解释器,它是一 个很小的应用(总共不超过500 行的代码).解释器负责程序和使用者的接口:从使用者那里获取文件或者字符串,并传给 Lua 标准

C API

--[[ 1. C API中的大部分函数并不检查他们参数的正确性,你需要在调用前确保参数的准确. 2. Lua 中的字符串不是以零为结束符的,他们依赖于一个明确的长度,因此可以包含任意的二进制数据. --Lua_string结尾总是零,但中间也可能包含零. 3. 无论你何时压入一个元素到栈上,你有责任确保在栈上有空间来做这件事情. int lua_checkstack(lua_State *L, int sz); 4. 永远不要将指向Lua字符串的指针保存到访问他们的外部函数中. ]] [[ 压

用LuaBridge为Lua绑定C/C++对象

最近为了总结Lua绑定C/C++对象的各种方法.第三方库和原理,学习了LuaBridge库为Lua绑定C/C++对象,下面是学习笔记,实质是对该库的Reference Manual基本上翻译了一遍,学习过程中测试代码,放在我的github上. LuaBridge的主要特点 源码只有头文件,没有.cpp文件,没有MakeFile,使用时只需一个#include即可. 支持不同的对象生命周期管理模式. 对Lua栈访问方便并且是类型安全的(type-safe). Automatic function

写自己的游戏 - 用颜色来区分不同的log输出(cocos2d-x) 同样适用于其他游戏引擎

游戏脚本化开发已经成为一种主流的趋势,伴随着产生大量的人才需求.近两年,各个游戏公司对于lua程序员的需求明显是增长额有点过分了,真的是太不正常了.抛开市场化需求的东西不谈,我们谈一些技术,一些琐碎的,可有可无,非重点的技术.近几天我都在写客户端的开发框架,目的就是让LUA程序员可以使用一款自己喜欢的编辑器,版本控制工具以及部分内部工具就可以随心所欲的开发逻辑模块,这对我来说也算是满有挑战性的,不过我喜欢,反正我都是写给自己玩,又不用别人去要求什么,所以随心所欲吧,尽量做到最好. 对于cocos

Lua1.1 垃圾回收

垃圾回收Lua1.1 中使用的是标记清理算法(Mark-and-sweep).Lua1.1 中有两种对象会被垃圾回收,字符串 string 和数组 array. 先看一下和垃圾回收相关的两个变量: /* Variables to controll garbage collection */ Word lua_block=10; /* to check when garbage collector will be called */ Word lua_nentity; /* counter of 

LuaBridge 中C++类和继承示例

luabridge不是一个陌生的名字,GIT上已经有3-4年多没有更新.将lua和C++相互调用封装的很方便,比如以下示例代码: ////////////////////////////////////////////////////////////////////////// // test code for luabridge class A { public: A() { } ~A() { } public: std::string get_title() const { return t