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. 在cocos2d-x界面中嵌入Android的WebView

    在Cocos2dxActivity.java中, (1) 增加函数onCreateLayout, [java]  view plain copy   public LinearLayout onCre ...

  2. Chapter 5. Label and Entry Widgets 标签和输入部件

    Chapter 5. Label and Entry Widgets  标签和输入部件 有时候,你需要用户输入特定的信息,比如他们的名字,地址或者 甚至序号. 简单的方式来实现这个是使用Enry 部件 ...

  3. (五)boost库之随机数random

    (五)boost库之随机数random boost库为我们提供了许多的日常随机数生成器: 1.uniform_smallint:在小整数域内的均匀分布 2.uniform_int:在整数域上的均匀分布 ...

  4. Unix/Linux环境C编程入门教程(30) 字符串操作那些事儿

    函数介绍 rindex(查找字符串中最后一个出现的指定字符) 相关函数 index,memchr,strchr,strrchr 表头文件 #include<string.h> 定义函数 c ...

  5. Codeforces Round #156 (Div. 2)---A. Greg&#39;s Workout

    Greg's Workout time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  6. JVM系列文章(三):Class文件内容解析

    作为一个程序猿,只知道怎么用是远远不够的.起码,你须要知道为什么能够这么用.即我们所谓底层的东西. 那究竟什么是底层呢?我认为这不能一概而论.以我如今的知识水平而言:对于Web开发人员,TCP/IP. ...

  7. linux 内核源代码分析 - 获取数组的大小

    #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) 測试程序: #include<stdio.h> #include<stdlib. ...

  8. 【精度问题】【HDU2899】Strange fuction

    Strange fuction Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  9. asp.net application

    Application 对象用于存储和访问来自任何页面的变量,类似于 session 对象.不同之处在于,所有的用户分享一个 Application 对象,而 session 对象和用户的关系是一一对 ...

  10. QT-Creator C/C++ 打地鼠小游戏

    废话少说先上图: 这个游戏纯属土鳖思路,没有用到什么游戏引擎. 1.使用按钮或QLabel铺满窗口. 2.通过简单算法随机动态的设置按钮矩阵中某个按钮的背景图像. 3.同步2过程反复设置多个按钮背景实 ...