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="helloworldfromLua" forwinstring.gmatch(s,"%a+")do print(w) end
这里是一个捕获并将配对字符分别存到不同变量的例子:
t={} s="from=world,to=Lua" fork,vinstring.gmatch(s,"(%w+)=(%w+)")do t[k]=v end fork,vinpairs(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("helloworld","(%w+)","%1%1")) hellohelloworldworld2
>print(string.gsub("helloLua","(%w+)%s*(%w+)","%2%1")) Luahello1
>string.gsub("helloworld","%w+",print) helloworld2
>lookupTable={["hello"]="hola",["world"]="mundo"} >print(string.gsub("helloworld","(%w+)",lookupTable)) holamundo2