lua原生解释器对字符串的处理能力是十分有限的,强大的字符串操作能力来自于string库。lua的string函数导出在string module中。在lua5.1,同一时候也作为string类型的成员方法,因此,我们既能够写成string.upper(s), 也能够s:upper(),选择你喜欢的写法。


string.len(s)返回s的长度。
string.rep(s, n)返回反复s字符串n次的字符串。
string.lower(s)返回一份已将大写转成小写的字符串s的拷贝 
lower,upper都是使用本地字符集的,另外,假设你想对一个string数组进行排序,并不区分大写和小写,你可能像这么写:
table.sort(a, function(a, b)
     return string.lower(a) < string.lower(b)
end)

string.sub(s, i, j)将从s提取一段字符串,从i到j(闭区间[i, j]),当然你能够使用负索引值,将从字符串尾部算起,-1是最后一个字符,-2是倒数第二,等等,这么做的优点是当我们要提取直到末尾几个字符时,从后面数起就非常方便。比如:
s = "[hello,world]"
print(string.sub(s, 2, -2)) --> hello,world

记住,lua中的字符串是不可变的。

string.char, string.byte用于转换字符和对于的数字之间值。比如:
i = 97
print(string.char(i, i+1, i+2)) --> abc
print(string.byte("abc"))       --> 97
print(string.byte("abc"), -2)   --> 98

lua5.1 string.byte能够接受第三个參数,返回i,j之间的多个值。比如,这么写将字符串转成字符值数组:
t = {s.byte(1, -1}
要想又一次转成字符串的话:
string.char(unpack(t))

string.format是强大字符串格式化函数,和c语言的printf类似,这里不累述。

lua string库里最强大的函数是那些模式匹配函数:find, match, gsub, gmatch。和其它脚本语言不同,lua既没实用POSIX的正則表達式,也没实用perl的正則表達式。原因是实现这些导致lua占用很多其它内存,而lua的初衷是小巧的,嵌入应用的语言。 lua用少于500行的代码实现了自己的一套模式匹配,尽管不如标准的正則表達式强(一般须要4000以上代码),但也足够强大。

string.find将查找目标模板在给定字符串中出现的位置,找到返回起始和结束位置,没找到返回nil。比如:
s = "hello,world"
i, j = string.find(s, "hello")
print(string.sub(s, i, j))
当然,string.find还能够给定起始搜索位置,当你想找出全部出现的位置时,这个參数就非常实用,比如想知道换行符出如今那些地方:
local t = {}
local i = 0
while true do
     i = string.find(s, "\n", i+1)
     if i == nil then break end
     t[#t+1] = i
end

string.match和string.find类似,都是在指定的string中查找对应的模式。不同的是,他返回的是找到的那部分string:
print(string.match("hello,world","hello")) --> hello
对于像"hello"这种固定模式来说,这个函数就没啥意义了。可是对于可变模式来说,就显示出他的强大威力了:
date = "now is 2014/10/6 17:58"
d = string.match(date, "%d+/%d+/%d+")
print(d)   --> 2014/10/6

string.gsub有三个參数,给定字符串,匹配模式和替代字符串。作用就是将全部符合匹配模式的地方都替换成替代字符串。并返回替换后的字符串,以及替换次数。
s = string.gsub("Lua is cute", "cute", "great")

print(s) --> Lua is great

string.gmatch函数将返回一个迭代器,用于迭代全部出如今给定字符串中的匹配字符串。

模式:
字符类:(character classes)

. all characters

%a letters

%c control characters

%d digits

%l lower -case letters

%p punctuation characters

%s space characters

%u upper-case letters

%w alphanumeric characters

%x hexadecimal digits

%z the character whose representation is 0

他们的大写版本号是他本身的互补。
魔法字符:
( ) . % + - * ? [ ] ^ $
用%进行转义。'%%'代表'%'

字符集(char -set ):使用字符集能够自己定义字符类。
1.不同的字符类,和单字符之间用[]
[%w_]匹配字母数字字符和下划线。
[01]匹配二进制数
2.要想字符集内包括字符区间,起止之间加上-
[0-9] 相当于 %d
[0-9a-fA-F]相当于 %x
3.假设想得到该字符集的互补,前面加上^
[^0-7] 不论什么非八进制数字

反复或可选修饰符
+ 1 or more repetitions,匹配最长的,

* 0 or more repetitions  最长的

- also 0 or more repetitions 最短的

? optional (0 or 1 occurrence) 

捕获
捕获机制同意一个模式串中的一部分来匹配目标串种的一部分。写法是模式串中你须要捕获的那部分用()括起来,比如:

pair = "name = anna"
key, value = string.match(pair, "(%a+)%s*=%s*(%a+)")
print(key, value) --> name anna
我们也能够将捕获用于模式串自身,"([\"'])(.-)%1",这里的%1表示匹配第一个捕获的一份拷贝。

替换
前面已知道,string.gsub的參数能够是string,事实上,也能够是个函数,或是table,假设是函数,就会用捕获的内容作为參数调用该函数,将返回的内容作为替换字符串。假设是table,则用捕获的内容为key去取table的值来作为替换字符串,假设不存在,就不做替换。如:
function expand(s)
     return string.gsub(s, "$(%w+)", _G)
end
name = "Lua"; status = "great"
print(expand("$name is $status, isn't it?"))

(完)

lua的string库与强大的模式匹配的更多相关文章

  1. Lua 之string库

    标准string库 基础字符串函数 string.len(s) 返回一个字符串的长度,例如 string.rep(s, n) 返回一个新的字符串,该字符串是参数s重复n次得到的结果,例如 )) -- ...

  2. 在lua的string库和正则表达式

    一.前提要了解一下lua 的string几个方法 1. string库中所有的字符索引从前往后是1,2,...;从后往前是-1,-2,... 2. string库中所有的function都不会直接操作 ...

  3. lua的string库

    lua支持的所有字符类 .      任意字符 %a   字母 %c 控制字符 %d 数字 %l         小写字母 %p  标点字符 %s 空白符 %u        大写字母 %w   字母 ...

  4. lua字符串处理(string库用法)

    原文地址http://www.freecls.com/a/2712/f lua的string库是用来处理字符串的,基础函数如下 string.byte(s [, i [, j]]) string.by ...

  5. Lua的string和string库总结

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

  6. Lua string库整理

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

  7. Lua 中的string库(字符串函数库)总结

    (字符串函数库)总结 投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014-11-20我要评论 这篇文章主要介绍了Lua中的string库(字符串函数库)总结,本文讲解了string库 ...

  8. lua string 库

    --lua中字符串索引从前往后是1,2,……,从后往前是-1,-2……. --string库中所有的function都不会直接操作字符串,只返回一个结果. ---------------------- ...

  9. Lua string库详解

    1. string库中所有的字符索引从前往后是1,2,...;从后往前是-1,-2,...2. string库中所有的function都不会直接操作字符串,而是返回一个结果 string.byte(s ...

随机推荐

  1. 在QTableView中使用各种自定义委托

    QT的MVC(View/Delegate)模型十分强大,可以利用各种控件来对表格的输入进行限制,不过我以前一直没有过,这几天研究了一下,写个小例子,希望大家喜欢. 如果看不懂这个例子,请先看QT的自带 ...

  2. LINUX总结第13篇:LINUX下动态库及版本号控制

    感觉讲得挺详细 注: ln 命令用法 ln –s 源文件 目标文件 (目标文件即为软链接文件) 可用ls -l查看软链接文件具体指向哪个文件 目录[-] 1. File libhello.c 2. F ...

  3. 2.4 statistical decision theory

    在讲完最小二乘(linear regression)和K近邻后,进入本节. 引入符号: $X\in R^p$ X为维度为p的输入向量 $Y\in R$ Y为输出,实数 $P(X,Y)$ 为两者的联合概 ...

  4. OMNeT++安装教程

    前提及注意事项: 1) 安装之前首先要确定已经安装好GCC编译环境(例如:MinGW.Cygwin,选择一种安装); (否则OMNeT++会安装不成功),具体安装教程详见另一篇文章 MinGW安装教程 ...

  5. OC基础9:预处理程序

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.  关于#define语句: (1). ...

  6. Minimum Sum(思维)

    Problem 1603 - Minimum Sum Time Limit: 2000MS   Memory Limit: 65536KB    Total Submit: 563  Accepted ...

  7. 设计师Yoyo:为用户设计产品,让他们生活更美好

    Yoyo设计走过的路:纽约爱立信,西雅图美国在线,硅谷雅虎,ATT,深圳腾讯,华为:Yoyo不仅是顶级的交互体验设计师,还是很Open的知识分享者,从职业选择,以及对年轻人的建议几个角度,摘录他的文章 ...

  8. 好用的侧边栏菜单/面板jQuery插件

    我想大家都用过一些APP应用,它们的菜单展示是以侧边栏滑动方式展现,感觉很新鲜,而现在网页设计也是如此,不少网站也效仿这样的方式来设计.使用侧边栏的好处就是可以节约空间,对于一些内容多或者喜欢简约的网 ...

  9. LeetCode Day3

     Lowest Common Ancestor of a Binary Search Tree import java.util.ArrayList; import java.util.List; / ...

  10. button属性值

    AccessibilityObject 取得指定給控制項的 AccessibleObject. (繼承自 Control). AccessibleDefaultActionDescription 取得 ...