Lua 之string库

标准string库

基础字符串函数

string.len(s)

返回一个字符串的长度,例如

print(string.len("hello world")) -- 11

string.rep(s, n)

返回一个新的字符串,该字符串是参数s重复n次得到的结果,例如

print(string.rep("go", 3)) -- gogogo

string.lower(s)

string.upper(s)

字符串大小写转换,例如

print(string.lower("gOogLe")) -- google
print(string.upper("gOogLe")) -- GOOGLE

string.sub(s, i, j)

返回字符串的一个子串,子串的起始/结束位置由参数i, j决定。例如:

print(string.sub("google", 2, 3))   -- ‘oo‘
print(string.sub("google", 4))      -- ‘gle‘
print(string.sub("google", 1, -2))  -- ‘googl‘
print(string.sub("google", 100))    -- ‘‘

string.char(num1, num2, ...)

string.byte(s, i, j)

在字符与其ASCII码之间转换。

string.char 函数接收零个或多个整数,并将每个整数转换成对应的字符,然后返回一个由这些字符构成的字符串。

string.byte 返回字符串s中第i到第j个字符的ASCII值,i值默认等于1,j值默认等于i。

print(string.byte(‘google‘))        -- 103
print(string.byte(‘google‘, 2))     -- 111
print(string.byte(‘google‘, 1, -1)) -- 103     111     111     103     108     101

print(string.char(111))             -- ‘o‘
print(string.char(103, 111, 101))   -- ‘goe‘

注意,string.char()返回一个字符串,而string.byte可能存在多个返回值,其中每个值都是一个number类型的数字。

string.format("format", s, ...)

格式化字符串,它跟C语言里面的printf函数非常类似,例如:

print(string.format("pi=%.4f", math.pi))

print(string.format("today is %02d/%02d/%04d", 27, 10, 2014))

模式匹配函数

模式匹配函数有4个:find、match、gsub(全局替换)、gmatch(全局匹配),它们都是基友模式匹配(pattern match)实现的。

string.find(s, b, pattern)

string.find 函数在一个给定的目标字符串中搜索符合指定pattern的第一个子串,如果找到返回子串的起始和结束位置,没有找到任何匹配,返回nil。

s = "hello sky, the sky is mine"

i, j = string.find(s, "sky")

print(‘i=‘ .. i .. ‘, j=‘ .. j)     -- i=7, j=9
print(string.sub(s, i, j))          -- ‘sky‘
print(string.find(s, ‘world‘))      -- nil

string.find函数的第3个参数可选(默认值为1),用于告诉函数应从目标字符串的哪个位置开始搜索,如果我们需要找到目标字符串中所有符合pattern的子串,这个参数就很有用,例如:

local t = {}
local i = 0
local s = ‘line 1\nline 2\nline 3\nline 4\nline 5\n‘

while true do
    i = string.find(s, "\n", i+1)
    if i==nil then break end
    t[#t+1] = i
end

当然,上面例子中的功能,有一个更加简单的实现办法,就是使用string.gmatch函数。

string.match(s, pattern)

函数string.match与string.find非常类似,不过它返回的是目标字符串中与pattern匹配的子串,而非子串所在的位置。

date = "today is 27/10/2014"
print(string.match(date, "%d+/%d+/%d+"))    -- 27/10/2014

string.gmatch(s, pattern)

string.gmatch 是全局匹配函数,它返回一个迭代器,通过返回的迭代器可以遍历目标字符串中所有出现指定模式的地方。

一个例子,找出给定字符串中的所有单词:

s = "hello sky, the sky is mine"

words = {}

for w in string.gmatch(s, "%a+") do
    words[#words+1] = w
end

for _,v in ipairs(words) do
    print(v)
end

string.gsub(s, pattern, rep, max)

string.gsub 是全局替换函数,将目标字符串中所有模式出现的地方替换为替换字符串。

第4个参数可选,用于限定替换的最大次数。

string.gsub函数有2个返回值,第一个返回值表示替换后的新字符串,第二个返回值表示替换次数。如果没有找到需要替换的模式,则分别返回原字符串和0;

old = "hello sky, the sky is mine"
new, count = string.gsub(old, "sky", "world")

print(new)      -- hello world, the world is mine
print(count)    -- 2

string.gsub 第3个参数除了是字符串以外,还可以是函数或table。

当用一个函数来调用时,string.gsub会在每次找到匹配时调用该函数,调用时的参数就是捕获到的内容,而该函数的返回值则作为要替换的字符串。
当用一个table来调用时,string.gsub会用每次捕获到的内容作为key,并将对于的value作为要替换的字符串,如果table中不包含这个key,那么string.gsub不改变这个匹配。

function expand(s)
    return (string.gsub(s, "$(%w+)", _G))
end

name = "Lua"
status = "greate"

print(expand("$name is $status, isn‘t it?"))
-- Lua is greate, isn‘t it?

上面的例子中,对每处与"$(%w+)"相匹配的地方,string.gsub都会在_G中查找捕获到的名称,并用找到的value替换字符串中的匹配部分。

如果不确定所有的变量都有一个对应的字符串值,则可以对它们的值应用tostring,这种情况下,可以用一个函数来提供要替换的值:

function expand(s)
    return (string.gsub(s, "$(%w+)", function(n) return tostring(_G[n]) end ))
end 

print(expand("print=$print; a=$a"))
-- print=function: 0x1f3fa40; a=nil

模式(pattern)

限于Lua解释器的大小,Lua并不支持完整的PCRE,但Lua的模式匹配也非常强大,支持元字符、字符集等。

注意:对于Lua来说,模式就是普通的字符串,只有上面提到的几个模式函数才能解释它们。


字符类


对应的字符集


.


任意字符


%a


字母


%c


控制字符


%d


数字


%l


小写字母


%p


标点符号


%s


空白符


%u


大写字母


%w


字母和数字


%x


16进制数字


%z


代表0的字符

上面字符类的大写形式表示小写所代表的集合的补集。

例如将目标字符串中出现的非字母字符替换为"."

print(string.gsub("hello, up-down!", "%A", ".")) -- hello..up.down. 4

计算一段文本中元音字母出现的次数:

count = select(2, string.gsub(text, "[AEIOUaeiou]", ""))

%


用作特殊字符(非字母字符)的转义字符,比如‘%%’匹配字符’%’


[ ]


匹配指定的字符集,比如[%w_]匹配数字、字母和下划线


 


+


匹配前一字符1次或多次,比如”%a+”匹配一个单词


*


匹配前一字符0次或多次,贪婪匹配,比如”%s*”匹配空白


-


匹配前一字符0次或多次,懒惰匹配


?


匹配前一字符0次或1次


^


匹配开头,如果在字符集[]里面就表示补集


$


匹配结尾


%b


匹配成对的字符

"+"修饰符可匹配属于字符分类的一个或多个字符,它总是获取与模式相匹配的最长序列。

修饰符"-"和"*"的区别是,前者匹配最短的子串,后者匹配最长的子串。

s = "if condition then statements end"
print(string.match(s, ‘[_%a][_%w]*‘))   -- if
print(string.match(s, ‘[_%a][_%w]-‘))   -- i

test = "int x; /* x */ int y; /* y */"
print(string.gsub(test, "/%*.*%*/", "<COMMENT>"))
-- int x; <COMMENT>        1

print(string.gsub(test, "/%*.-%*/", "<COMMENT>"))
-- int x; <COMMENT> int y; <COMMENT>       2

%b用于匹配成对的字符,如下:

s = "a (enclosed (in) parentheses) line"
print(string.gsub(s, "%b()", ""))       -- a  line 1

test = "<title> hello world </title>"
print(string.gsub(test, "%b<>", ""))    -- hello world    2

捕获(capture)

捕获功能可根据一个模式从目标字符串中抽出匹配与该模式的内容。在指定捕获时,在模式中将需要捕获的部分写到一对圆括号内。

对于具有捕获的模式,函数string.match会将所有捕获到的值作为单独的结果返回。即将目标字符串切成多个捕获到的部分。

pair = "name = Anna"
key, value = string.match(pair, "(%a+)%s*=%s*(%a+)")
print(key, value)       -- name    Anna

在一个模式中,可以使用 "%1"、"%2" 这样的项,表示匹配与第d个捕获相同的内容。

如下面的例子,模式中的"%1"表示匹配第一个捕获(即引号)的内容,从而用来指定第二个引号。

s = [[then he said: "it‘s all right"!]]
q, quotedPart = string.match(s, "([\"‘])(.-)%1")
print(quotedPart)   -- it‘s all right

"%0"表示整个匹配

print(string.gsub("hello Lua!", "%a", "%0-%0"))
-- h-he-el-ll-lo-o L-Lu-ua-a!      8
时间: 2024-08-05 06:56:38

Lua 之string库的相关文章

lua的string库与强大的模式匹配

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,upp

在lua的string库和正则表达式

一.前提要了解一下lua 的string几个方法 1. string库中所有的字符索引从前往后是1,2,...;从后往前是-1,-2,... 2. string库中所有的function都不会直接操作字符串,而是返回一个结果 string.len(s):返回字符串的长度. string.lower(s):变小写. string.upper(s):变大写. string.rep(s,n):将s拷贝n份,并连接起来,返回. string.sub(s,i [,j]):取s中从i开始到j为止的自字符串.

Lua的string和string库总结

Lua有7种数据类型,分别是nil.boolean.number.string.table.function.userdata.这里我总结一下Lua的string类型和string库,复习一下,以便加深记忆. 个人认为string是Lua编程使用数据结构的时候,重要性仅次于table的类型.十分重要! 一.string基础. Lua并没有字符类型,Lua的string类型表示字符序列.所以,长度为1的string就表示了单个字符.Lua的字符类型有这些特征: 1.string字符序列中的字符采用

LUA string库

Lua解释器对字符串的支持很有限.一个程序可以创建字符串并连接字符串,但不能截取子串,检查字符串的大小,检测字符串的内容.在Lua中操纵字符串的功能基本来自于string库. 一.String库的常用函数: --返回字符串s的长度 local s = "HelloWorld" print(string.len(s)) -->10 --重复n次字符串s的串 print(string.rep(s,2)) -->HelloWorldHelloWorld --大写字母转换成小写 p

LUA string库详解

1. string库中所有的字符索引从前往后是1,2,...;从后往前是-1,-2,... 2. string库中所有的function都不会直接操作字符串,而是返回一个结果 string.byte(string [,pos]):返回第pos个字符的整数表示形式.如a为97. string.char(i1,i2...):i1,i2为整型,将i1,i2..等转化为对应的字符然后连接成字符串,并返回.如i1=97则返回a. string.dump(functoin):返回一个参数函数的2进制代码.(

lua string 库

--lua中字符串索引从前往后是1,2,……,从后往前是-1,-2……. --string库中所有的function都不会直接操作字符串,只返回一个结果. -------------------------------------------------------------------------------------------------- [基本函数] 函数 描述 示例 结果 len 计算字符串长度 string.len("abcd") 4 rep 返回字符串s的n个拷贝

Lua_第19章 String 库(上)

Lua_第19章String 库 Lua解释器对字符串的支持很有限.一个程序可以创建字符串并连接字符串,但不能截取子串,检查字符串的大小,检测字符串的内容.在 Lua中操纵字符串的功能基本来自于 string 库. String 库中的一些函数是非常简单的:string.len(s)返回字符串 s 的长度;string.rep(s, n)返回重复 n 次字符串 s 的串;你使用 string.rep("a", 2^20)可以创建一个 1M bytes 的字符 串(比如,为了测试需要);

Lua_第19章 String 库(下)

Lua_第19章 String 库(下) 19.3捕获(Captures) Capture(下面译为捕获或者capture,模式中捕获的概念指,使用临时变量来保存匹配的子模式,常用于 向前引用.)是这样一种机制:可以使用模式串的一部分匹配目标串的一部分.将你想捕 获的模式用圆括号括起来,就指定了一个capture.在 string.find 使用captures 的时候,函数会返回捕获的值作为额外的结果.这常被用 来将一个目标串拆分成多个: pair = "name =Anna" _,

Lua中字符串库中的几个重点函数

前言 在<Lua中的一些库>中也说道了,要对string库的模式匹配进行单独的讲解.对于字符串的处理,对于任何语言的学习来说,都是一个难点,而且也是一个必会的知识点.给你一个字符串,让你按照某种需求进行处理,你不会,那是多么尴尬的一件事情.所以,看完<Lua中的一些库>和这篇文章之后,我争取做到让你在处理字符串时,不再感到捉襟见肘,不再尴尬. 说到Lua中的模式匹配,基本上就是围绕着以下几个函数展开的: find match gsub gmatch 我的总结也就是围绕着上面的四个函