模式匹配函数
在string库中功能最强大的函数是:
string.find(字符串查找)
string.gsub(全局字符串替换)
string.gfind(全局字符串查找)
string.gmatch(返回查找到字符串的迭代器)
</div>
这些函数都是基于模式匹配的。与其他脚本语言不同的是,Lua并不使用POSIX规范的正则表达式[4](也写作regexp)来进行模式匹配。主要的原因出于程序大小方面的考虑:实现一个典型的符合POSIX标准的regexp大概需要4000行代码,这比整个Lua标准库加在一起都大。权衡之下,Lua中的模式匹配的实现只用了500行代码,当然这意味着不可能实现POSIX所规范的所有更能。然而,Lua中的模式匹配功能是很强大的,并且包含了一些使用标准POSIX模式匹配不容易实现的功能。
string.gmatch(str, pattern)
这是一个返回迭代器的函数. 实际的用例如下:
s = "hello world from Lua"
for w in string.gmatch(s, "%a+") do
print(w)
end
</div>
这里是一个捕获并将配对字符分别存到不同变量的例子:
t = {}
s = "from=world, to=Lua"
for k, v in string.gmatch(s, "(%w+)=(%w+)") do
t[k]=v
end
for k, v in pairs(t) do
print(k, v)
end
</div>
string.gsub(str, pattern, repl, n)
string.gsub()函数根据给定的配对表达式对源字符串str进行配对, 同时返回源字符串的一个副本, 该副本中成功配对的所有子字符串都将被替换. 函数还将返回成功配对的次数.实际的替换行为由repl参数的类型决定:
当repl为字符串时, 所有成功配对的子字符串均会被替换成指定的repl字串.
当repl为table时, 对每个成功配对的子字符串, 函数均会试图寻找以其为key值的table中的元素, 并返回该元素. 如果该配对包含任何捕获信息, 则以编号为1号的捕获作为key值进行查找.
当repl为函数时, 每个成功配对的子字符串均会作为参数被传入到该函数中去.
在repl是table或函数时, 如果该table或函数返回了字串或数字的值, 这个值依然会被用于替换副本字串中的配对子字串. 如果该table/函数返回的值为空, 将不发生替换.
n参数可选, 当它被指定时, string.gsub()函数只对源字符串中的前n个成功配对的成员进行操作.
以下是几个例子:
> print(string.gsub("hello world", "(%w+)", "%1 %1"))
hello hello world world 2
> print(string.gsub("hello Lua", "(%w+)%s*(%w+)", "%2 %1"))
Lua hello 1
> string.gsub("hello world", "%w+", print)
hello world 2
> lookupTable = {["hello"] = "hola", ["world"] = "mundo"}
> print(string.gsub("hello world", "(%w+)", lookupTable))
hola mundo 2
</div>
string.match(str, pattern, init)
string.match()只寻找源字串str中的第一个配对. 参数init可选, 指定搜寻过程的起点, 默认为1.
在成功配对时, 函数将返回配对表达式中的所有捕获结果; 如果没有设置捕获标记, 则返回整个配对字符串. 当没有成功的配对时, 返回nil.
string.match("abcdaef", "a")
-> a
</div>
string.reverse(str)
返回一个字符串的倒序排列
string.reverse("abcde")
->edcba
</div>
string.dump(function)
返回指定函数的二进制代码(函数必须是一个Lua函数,并且没有上值)
string.find(str, pattern, init, plain)
string.find的基本应用就是用来在目标串(subject string)内搜索匹配指定的模式的串。函数如果找到匹配的串返回他的位置,否则返回nil.最简单的模式就是一个单词,仅仅匹配单词本身。比如,模式'hello'仅仅匹配目标串中的"hello"。当查找到模式的时候,函数返回两个值:匹配串开始索引和结束索引。
s = "hello world"
string.find(s, "hello") --> 1 5
string.find(s, "world") --> 7 11
string.find(s, "l") --> 3 3
string.find(s, "lll") --> nil
</div>
string.find函数第三个参数是可选的:标示目标串中搜索的起始位置。当我们想查找目标串中所有匹配的子串的时候,这个选项非常有用。我们可以不断的循环搜索,每一次从前一次匹配的结束位置开始。下面看一个例子,下面的代码用一个字符串中所有的新行构造一个表:
local t = {} -- 存放回车符的位置
local i = 0
while true do
i = string.find(s, "\n", i+1) -- 查找下一行
if i == nil then break end
table.insert(t, i)
end
</div>
string.sub(str,sPos,ePos)
string.gsub的功能是截取字符串,他从指定起始位置截取一个字符串。string.sub可以利用string.find返回的值截取匹配的子串。
对简单模式而言,匹配的就是其本身
s = "hello world"
local i, j = string.find(s, "hello") --> 1 5
string.sub(s, i, j) --> hello
</div>
string.gsub(str, sourcestr, desstr)
string.gsub的基本作用是用来查找匹配模式的串,并将使用替换串其替换掉:
string.gsub函数有三个参数:目标串,模式串,替换串。
s = string.gsub("Lua is cute", "cute", "great")
print(s) --> Lua is great
s = string.gsub("all lii", "l", "x")
print(s) --> axx xii
s = string.gsub("Lua is great", "perl", "tcl")
print(s) --> Lua is great
</div>
第四个参数是可选的,用来限制替换的范围:
s = string.gsub("all lii", "l", "x", 1)
print(s) &nb

