Lua字符串模式匹配函数小结

模式匹配函数

在string库中功能最强大的函数是:

string.find(字符串查找)

string.gsub(全局字符串替换)

string.gfind(全局字符串查找)

string.gmatch(返回查找到字符串的迭代器)


这些函数都是基于模式匹配的。与其他脚本语言不同的是,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


这里是一个捕获并将配对字符分别存到不同变量的例子:

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

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

以上是 Lua字符串模式匹配函数小结 的全部内容, 来源链接: utcz.com/z/321111.html

回到顶部