Lua字符串库小集

1. 基础字符串函数:
    字符串库中有一些函数非常简单,如:
    1). string.len(s) 返回字符串s的长度;
    2). string.rep(s,n) 返回字符串s重复n次的结果;
    3). string.lower(s) 返回s的副本,其中所有的大写都被转换为了小写形式,其他字符不变;
    4). string.upper(s) 和lower相反,将小写转换为大写;
    5). string.sub(s,i,j) 提取字符串s的第i个到第j个字符。Lua中,第一个字符的索引值为1,最后一个为-1,以此类推,如:
    print(string.sub("[hello world]",2,-2))      --输出hello world
    6). string.format(s,...) 返回格式化后的字符串,其格式化规则等同于C语言中printf函数,如:
    print(string.format("pi = %.4f",math.pi)) --输出pi = 3.1416
    7). string.char(...) 参数为0到多个整数,并将每个整数转换为对应的字符。然后返回一个由这些字符连接而成的字符串,如:
    print(string.char(97,98,99)) --输出abc
    8). string.byte(s,i) 返回字符串s的第i个字符的Ascii值,如果没有第二个参数,缺省返回第一个字符的Ascii值。
    print(string.byte("abc"))      --输出97
    print(string.byte("abc",-1))  --输出99
    由于字符串类型的变量都是不可变类型的变量,因此在所有和string相关的函数中,都无法改变参数中的字符串值,而是生成一个新值返回。

2. 模式匹配函数:
    Lua的字符串库提供了一组强大的模式匹配函数,如find、match、gsub和gmatch。
    1). string.find函数:
    在目标字符串中搜索一个模式,如果找到,则返回匹配的起始索引和结束索引,否则返回nil。如:

  1. s = "hello world"
  2. i, j = string.find(s,"hello")
  3. print(i, j) --输出1 5
  4. i, j = string.find(s,"l")
  5. print(i, j) --输出3 3
  6. print(string.find(s,"lll")) --输出nil

string.find函数还有一个可选参数,它是一个索引,用于告诉函数从目标字符串的哪个位置开始搜索。主要用于搜索目标字符串中所有匹配的子字符串,且每次搜索都从上一次找到的位置开始。如:

  1. local t = {}
  2. local i =
  3. while true do
  4. i = string.find(s,"\n",i+)
  5. if i == nil then
  6. break
  7. end
  8. t[#t + ] = i
  9. end

2). string.match函数:
    该函数返回目标字符串中和模式字符串匹配的部分。如:

  1. date = "Today is 2012-01-01"
  2. d = string.match(date,"%d+\-%d+\-%d+")
  3. print(d) --输出2012-01-01

3). string.gsub函数:
    该函数有3个参数,目标字符串、模式和替换字符串。基本用法是将目标字符串中所有出现模式的地方替换为替换字符串。如:
    print(string.gsub("Lua is cute","cute","great"))  --输出Lua is great

  该函数还有可选的第4个参数,即实际替换的次数。
    print(string.gsub("all lii","l","x",1))  --输出axl lii
    print(string.gsub("all lii","l","x",2))  --输出axx lii

函数string.gsub 返回还有另一个结果,即实际替换的次数。
    count = select(2, string.gsub(str," "," "))  --输出str中空格的数量

  还能根据这个函数来实现一些其他的功能,譬如 split string:

  1. string.split = function(s, p)
  2. local rt= {}
  3. string.gsub(s, '[^'..p..']+', function(w) table.insert(rt, w) end )
  4. return rt
  5. end
  6.  
  7. -- 测试代码如下:
  8. local str = "abc,123,hello,ok"
  9. local list = string.split(str, ',')
  10. for _, s in ipairs(list) do
  11. print(tostring(s))
  12. end
    -- 输出结果如下
    abc
    123
    hello
    ok

 另外观看 云风的这篇文章,发现string.gsub函数 还可以这样用:

  1. local str = "#qwe&qwe&qwe&##qwe&qwe&qwe&##qwe&qwe&qwe&##qwe&qwe&qwe&#"
  2. str = str.rep(str , )
  3.  
  4. str = string.gsub(str , '&', '&')
  5. str = string.gsub(str , '#', '@@@')
  6. str = string.gsub(str , 'q', 'Q')
  7. str = string.gsub(str , '#', 'B-B')
  8. print(str)

上述的实现也可写成这样 来写~如下:

  1. local escapeAttrib = {
  2. ['&'] = '&';
  3. ['#'] = '@@@';
  4. ['q'] = 'Q';
  5. ['e'] = 'B-B';
  6. }
  7.  
  8. local str = "#qwe&qwe&qwe&##qwe&qwe&qwe&##qwe&qwe&qwe&##qwe&qwe&qwe&#"
  9. str = str.rep(str , )
  10. str = string.gsub(str , '[&#qe]', escapeAttrib)
  11. print(str)

  使用lua自带的SciTe 跑了多次,目测 前者表现会稍好一点;

  4). string.gmatch函数:
    返回一个函数,通过这个返回的函数可以遍历到一个字符串中所有出现指定模式的地方。如:

  1. words = {}
  2. s = "hello world"
  3. for w in string.gmatch(s,"%a+") do print("----")
  4. print(w)
  5. words[#words + ] = w
  6. end
  7. --输出结果为:
    ----
    hello                                                                                                ----world

3. 模式:
    下面的列表给出了Lua目前支持的模式元字符;

模式元字符 描述
. 所有字符
%a 字母
%c 控制字符
%d 数字
%l 小写字母
%p 标点符号
%s 空白字符
%u 大写字母
%w 字母和数字字符
%x 十六进制数字
%z 内部表示为0的字符

这些元字符的大写形式表示它们的补集,如%A,表示所有非字母字符。
    print(string.gsub("hello, up-down!","%S","."))   --输出hello..up.down. 4
    上例中的4表示替换的次数。
    除了上述元字符之外,Lua还提供了另外几个关键字符。如:( ) . % + - * ? [ ] ^ $
    其中%表示转义字符,如%.表示点(.),%%表示百分号(%)。
    方括号[]表示将不同的字符分类,即可创建出属于自己的字符分类,如[%w_]表示匹配字符、数字和下划线。
    横线(-)表示连接一个范围,比如[0-9A-Z]
    如果^字符在方括号内 ,如[^\n],表示除\n之外的所有字符,即表示方括号中的分类的补集。如果^不在方括号内,则表示以后面的字符开头,$和它正好相反,表示以前面的字符结束。如:^Hello%d$,匹配的字符串可能为Hello1、Hello2等。
    在Lua中还提供了4种用来修饰模式中的重复部分,如:+(重复1次或多次)、*(重复0次或多次)、-(重复0次或多次)和?(出现0或1次)。如:
    print(string.gsub("one, and two; and three","%a+","word")) --输出word, word word; word word
    print(string.match("the number 1298 is even","%d+")) --输出1298
    星号(*)和横线(-)的主要差别是,星号总是试图匹配更多的字符,而横线则总是试图匹配最少的字符。

格式字符串可能包含以下的转义码:

%c - 接受一个数字, 并将其转化为ASCII码表中对应的字符
%d, %i - 接受一个数字并将其转化为有符号的整数格式
%o - 接受一个数字并将其转化为八进制数格式
%u - 接受一个数字并将其转化为无符号整数格式
%x - 接受一个数字并将其转化为十六进制数格式, 使用小写字母
%X - 接受一个数字并将其转化为十六进制数格式, 使用大写字母
%e - 接受一个数字并将其转化为科学记数法格式, 使用小写字母e
%E - 接受一个数字并将其转化为科学记数法格式, 使用大写字母E
%f - 接受一个数字并将其转化为浮点数格式
%g(%G) - 接受一个数字并将其转化为%e(%E, 对应%G)及%f中较短的一种格式
%q - 接受一个字符串并将其转化为可安全被Lua编译器读入的格式(即将该string添加了"")
%s - 接受一个字符串并按照给定的参数格式化该字符串

为进一步细化格式, 可以在%号后添加参数. 参数将以如下的顺序读入:

(1) 符号: 一个+号表示其后的数字转义符将让正数显示正号. 默认情况下只有负数显示符号.
(2) 占位符: 一个0, 在后面指定了字串宽度时占位用. 不填时的默认占位符是空格.
(3) 对齐标识: 在指定了字串宽度时, 默认为右对齐, 增加-号可以改为左对齐.
(4) 宽度数值 
(5) 小数位数/字串裁切: 在宽度数值后增加的小数部分n, 若后接f(浮点数转义符, 如%6.3f)则设定该浮点数的小数只保留n位, 若后接s(字符串转义符, 如%5.3s)则设定该字符串只显示前n位.

4. 捕获(capture):
    捕获功能可根据一个模式从目标字符串中抽出匹配于该模式的内容。在指定捕获是,应将模式中需要捕获的部分写到一对圆括号内。对于具有捕获的模式,函数string.match会将所有捕获到的值作为单独的结果返回。即它会将目标字符串切成多个捕获到的部分。如:

  1. pair = "name = Anna"
  2. key,value = string.match(pair,"(%a+)%s*=%s*(%a+)")
  3. print(key,value) --输出name anna
  4.  
  5. date = "Today is 2012-01-02"
  6. y,m,d = string.match(date,"(%d+)\-(%d+)\-(%d+)")
  7. print(y,m,d) --输出2012 01 02

还可以对模式本身使用捕获。即%1表示第一个捕获,以此类推,%0表示整个匹配,如:

  1. print(string.gsub("hello Lua","(.)(.)","%2%1")) --将相邻的两个字符对调,输出为ehll ouLa
  2. print(string.gsub("hello Lua!","%a","%0-%0")) --输出为h-he-el-ll-lo-o L-Lu-ua-a!

5. 替换:
    string.gsub函数的第三个参数不仅可以是字符串,也可以是函数或table,如果是函数,string.gsub会在每次找到匹配时调用该函 数,调用时的参数就是捕获到的内容,而该函数的返回值则作为要替换的字符串。当用一个table来调用时,string.gsub会用每次捕获到的内容作 为key,在table中查找,并将对应的value作为要替换的字符串。如果table中不包含这个key,那么string.gsub不改变这个匹 配。如:

  1. function expand(s)
  2. return (string.gsub(s,"$(%w+)",_G))
  3. end
  4.  
  5. name = "Lua"; status = "great"
  6. print(expand("$name is $status, isn't it?")) --输出 Lua is great, isn't it?
  7. print(expand("$othername is $status, isn't it?")) --输出 $othername is great, isn't it?
  8.  
  9. function expand2(s)
  10. return (string.gsub(s,"$(%w+)",function(n) return tostring(_G[n]) end))
  11. end
  12.  
  13. print(expand2("print = $print; a = $a")) --输出 print = function: 002B77C0; a = nil

另外:附上网路上关于Lua的table和String相互转化的方法如下:

  1. -- 序列化tablle表--將表轉化成string
  2. function serialize(obj)
  3. local lua = ""
  4. local t = type(obj)
  5. if t == "number" then
  6. lua = lua .. obj
  7. elseif t == "boolean" then
  8. lua = lua .. tostring(obj)
  9. elseif t == "string" then
  10. lua = lua .. string.format("%q", obj)
  11. elseif t == "table" then
  12. lua = lua .. "{\n"
  13. for k, v in pairs(obj) do
  14. lua = lua .. "[" .. serialize(k) .. "]=" .. serialize(v) .. ",\n"
  15. end
  16. local metatable = getmetatable(obj)
  17. if metatable ~= nil and type(metatable.__index) == "table" then
  18. for k, v in pairs(metatable.__index) do
  19. lua = lua .. "[" .. serialize(k) .. "]=" .. serialize(v) .. ",\n"
  20. end
  21. end
  22. lua = lua .. "}"
  23. elseif t == "nil" then
  24. return nil
  25. else
  26. return "-nil-"
  27. --error("can not serialize a " .. t .. " type.")
  28. end
  29. return lua
  30. end
  31.  
  32. -- 反序列化tablle表--將string轉化成table
  33. function unserialize(lua)
  34. local t = type(lua)
  35. if t == "nil" or lua == "" then
  36. return nil
  37. elseif t == "number" or t == "string" or t == "boolean" then
  38. lua = tostring(lua)
  39. else
  40. error("can not unserialize a " .. t .. " type.")
  41. end
  42. lua = "return " .. lua
  43. local func = loadstring(lua)
  44. if func == nil then
  45. return nil
  46. end
  47. return func()
  48. end

未完带整理;阅参考文章 请Click :Here

Lua字符串库(整理)的更多相关文章

  1. Step By Step(Lua字符串库)

    Step By Step(Lua字符串库) 1. 基础字符串函数:    字符串库中有一些函数非常简单,如:    1). string.len(s) 返回字符串s的长度:    2). string ...

  2. Lua字符串库

    1. 基础字符串函数:    字符串库中有一些函数非常简单,如:    1). string.len(s) 返回字符串s的长度:    2). string.rep(s,n) 返回字符串s重复n次的结 ...

  3. Lua string库整理

    string库提供了字符串处理的通用函数. 例如字符串查找.子串.模式匹配等. 当在 Lua 中对字符串做索引时,第一个字符从 1 开始计算(而不是 C 里的 0 ). 索引可以是负数,它指从字符串末 ...

  4. Step By Step(Lua字符串库) (转)

    1. 基础字符串函数:    字符串库中有一些函数非常简单,如:    1). string.len(s) 返回字符串s的长度:    2). string.rep(s,n) 返回字符串s重复n次的结 ...

  5. Lua table库整理(v5.1)

    这个库提供了表处理的通用函数. 所有函数都放在表 table. 无论何时,若一个操作需要取表的长度, 这张表必须是一个真序列. table.concat(list, [, sep, [, i , [, ...

  6. Step By Step(Lua输入输出库)

    Step By Step(Lua输入输出库) I/O库为文件操作提供了两种不同的模型,简单模型和完整模型.简单模型假设一个当前输入文件和一个当前输出文件,他的I/O操作均作用于这些文件.完整模型则使用 ...

  7. ulua 路径小记 以及 lua require 机制整理

    ulua 路径小记 在学习ulua时,require模块的根路径可以为项目的Lua文件夹或者ToLua文件夹(Editor下),但是在package.path和package.cpath中并没有看到当 ...

  8. C\C++ 框架和库整理(转)

    [本文系外部转贴,原文地址:http://coolshell.info/c/c++/2014/12/13/c-open-project.htm]留作存档 下次造轮子前先看看现有的轮子吧 值得学习的C语 ...

  9. Lua标准库(转)

    转载地址:http://www.yiibai.com/lua/lua_standard_libraries.html Lua的标准库提供了一组丰富的功能,与C的API直接实现,建立在Lua编程语言函数 ...

随机推荐

  1. ASP.NET页面之间传递值的几种方式

    目录 QueryString Session Cookie Application 一.QueryString QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中. ...

  2. linux指令记录

    sudo mount /dev/sda3 data 挂载硬盘到当前目录下的data文件夹

  3. Oracle中rownum和rowid的理解(转)

    本文转自地址http://www.linuxidc.com/Linux/2012-04/58300.htm rownum,rowid都叫伪列. 但是,rownum是逻辑上的编号,且其值总是从1开始,每 ...

  4. eclipse开发环境搭建

    1.eclipse插件OpenExplorer快速打开文件目录 下载地址:https://github.com/samsonw/OpenExplorer/downloads 下载jar包,将jar包放 ...

  5. Github 新的项目管理模式——Projects

    Github 新的项目管理模式--Projects Issues Github 中传统的项目管理是使用 issue 和 pull request 进行的,这部分内容不是本文重点,不再赘述. 但有一些功 ...

  6. scrollHeight、scrollTop等的比较

    自接触js以来一直使用的是jquery插件,对js的了解甚少,经常容易混淆element.scrollHeight.element.scrollTop等方法.今天对这些方法做出比较. scrollTo ...

  7. [机器学习] 在茫茫人海中发现相似的你:实现局部敏感哈希(LSH)并应用于文档检索

    简介 局部敏感哈希(Locality Sensitive Hasing)是一种近邻搜索模型,由斯坦福大学的Mose Charikar提出.我们用一种随机投影(Random Projection)的方式 ...

  8. NSIS(001)检测和结束进程是否运行?

    配合插件:killer.dll 导入DLL:ReserveFile "${NSISDIR}\Plugins\killer.dll" 使用方法: ;可以检测和结束32位程序进程和64 ...

  9. Android中<original-package>标签含义

    在AndroidManifest.xml中,<original-package>与<manifest package=...>中的区别:<original-package ...

  10. C++ - 复制(copy) 和 虚复制(virtual copy) 的 区别

    复制(copy) 和 虚复制(virtual copy) 的 区别 本文地址: http://blog.csdn.net/caroline_wendy/article/details/16120397 ...