本文内容向导- 介绍
- 字符串连接与构造
- 字符串格式
- 大小写转换
- 分割字符串位置
- 查找子符串
介绍我认为,当涉及到字符串处理,Perl的凯迪拉克工业。但是Lua在字符串前面也不错. 字符串连接与构造级联Lua中使用两个操作符一样简单(..): | #!/usr/bin/lua
local fname = "Barack"
local lname = "Obama"
local wholename = fname .. " " .. lname
print (wholename) --Prints "Barack Obama"
|
你可以建立一个字符串的字符都是一样的rep()字符串。以下所示: | #!/usr/bin/lua
local fname = string.rep( '=' , 20); print (fname)
|
前打印一行等号20长: | slitt @mydesk :~$ ./test.lua
====================
slitt @mydesk :~$
|
字符串格式另一种方式来创建字符串的字符串格式化,这样做的format()字符串。命令。这个函数的第一个参数是模板字符串不同的令牌的其他参数所取代。为实例: | #!/usr/bin/lua
local fname= "Peter"
local lname= "Piper"
local avg=87.567
local str = string. format ( "Student %s %s has a test average of %4.1f%%." , fname, lname, avg);
print (str)
|
产生以下输出: | slitt @mydesk :~$ ./test.lua
Student Peter Piper has a test average of 87.6%.
slitt @mydesk :~$
|
注意以下几点: - %s必须更换一个字符串
- %f必须更换由一个数字(浮点)
- 4.1f %表示1小数点位置,最小的总宽度包含点4。
- 你必须使用%%代表一个百分号而不作特殊转换
这里有一些你应该知道的其他事情: 宽度,零点和理由记得% 4.1d意味着1位与最低的4的宽度?手表该柱状的报告. | #!/usr/bin/lua
local str = string. format ( "%-10s %-10s %8s" , "Lastname" , "Firstname" , "Amount" );
print (str)
local str = string. format ( "%-10s %-10s %8s" , "--------" , "---------" , "------" );
print (str)
local str = string. format ( "%-10s, %-10s contributed $ %8.2f" , "Anderson" , "Al" , "1200" );
print (str)
local str = string. format ( "%-10s, %-10s contributed $ %8.2f" , "Foster" , "Fred" , "32.67" );
print (str)
local str = string. format ( "%-10s, %-10s contributed $ %8.2f" , "Jones" , "John" , "400" );
print (str)
local str = string. format ( "%-10s, %-10s contributed $ %8.2f" , "Smith" , "Sam" , "900" );
print (str)
|
以下为输出结果: | slitt @mydesk :~$ ./test.lua
Lastname Firstname Amount
-------- --------- ------
Anderson , Al contributed $ 1200.00
Foster , Fred contributed $ 32.67
Jones , John contributed $ 400.00
Smith , Sam contributed $ 900.00
slitt @mydesk :~$
|
我们给每一个名字,每个名字的宽度为10,并通过使负我们左对齐它而不是默认的右对齐。的数量,这应该是正确的justifed,我们就有一积极的宽度是正当的。这是容易使标题相匹配的行项目,因为我们用相同的宽度。 你和我知道这会如果我们把它放在更好的一个环,有一个项目表。但由于这节课之前一个表,我只是普通的。 有时你想有数字0填写必要的宽度。没问题。相反的令牌被8.2f %,使它08.2f %。零告诉format()字符串。前置前导零。 最常用的标记%s字符串,%的F为浮点数,并%d整数。还有其他人,他们可以期待在Lua手册。 大小写转换转换字符串为大写,使用 string.upper(str). 转换字符串为小写,使用 string.lower(str). 要做的事情一样,将每个单词的第一个字母要大写(titlecase)或首字母大写的每一句话,你需要使用更先进的技术。. 字符串分割处理你用sub()字符串。以分割字符串的字符的位置(指数)。这个函数返回一个字符串是原来的子字符串。它的语法是这样的:: string.sub(strng, index_start [, index_end]) 在哪儿理解要把字符串,index_start是第一个字符的索引返回,并index_end是该指数最后一个字符被返回。如果index_end是不存在的,一切的字符index_start和更大的字符串的末尾返回。事实上,index_start和index_end可负给你更多的权力。如果是负的,它是相对于原始字符串的开始而不是结束,与1的原始字符串的末尾。你不应该使用0无论是指数。下面的程序是很明显的: | #!/usr/bin/lua
print (string. sub ( "123456789" , 1)) --should print original string
print (string. sub ( "123456789" , 1, -1)) --should print original string
print (string. sub ( "123456789" , 4, 7)) --should print 4567
print (string. sub ( "123456789" , 1, 4)) --should print the 1st 4 chars
print (string. sub ( "123456789" , -4, -1)) --should print the last 4 chars
print (string. sub ( "123456789" , 2, -2)) --should remove the first and last char
print (string. sub ( "123456789" , 2)) --should remove the first char
print (string. sub ( "123456789" , 1, -2)) --should remove the last char
print (string. sub ( "123456789" , -2)) --should print only the last 2 chars
print (string. sub ( "123456789" , 1, 2)) --should print only the first 2 chars
|
上面程序输出以下结果: | slitt @mydesk :~$ ./test.lua
123456789
123456789
4567
1234
6789
2345678
23456789
12345678
89
12
slitt @mydesk :~$
|
umenu菜单定义文件的一个例子。第一个字符是一个关键的,第二个字符可以是任何东西,只是人类由程序忽略,并从第三个字符的值。这里的你如何做:: #!/usr/bin/lua
local strng = "T_Kt to MPH converter"
local key = string.sub(strng, 1, 1)
local value = string.sub(strng, 3)
print(strng) print(key) print(value) 产生以下输出: | slitt @mydesk :~$ ./test.lua
T_Kt to MPH converter
T
Kt to MPH converter
slitt @mydesk :~$
|
string.sub() 功能可以结合其他字符串处理函数做比较强大的东西。.
查找字符串前一部分,阐述了如何利用特征发现的子串位置。另一种方法是通过搜索模式,找到他们。在这一点我们已经非常接近的概念“规则表达式”,任何Lua afficianado会告诉你不存在Lua除非你负荷POSIX模块。当然,你和我知道Lua是建立在字符串函数可以做很多别的什么语言的正则表达式可以做。lua的match()字符串。,gmatch()字符串。和find()字符串。建于功能帮助你找到的匹配的子串: 语法 | 返回 | 说明 | string.find(s, pattern [, init [, plain]]) | 第一个符串匹配位置 | 返回的索引发现匹配这给你一个伟大的方式来瓜分字符串。 | string.match(s, pattern [, init]) | 匹配 | 返回捕获(的发现模式实例),或无如果没有被发现。得到了一大一小串的快速方法一,或检测是否存在的模式。 | string.gmatch(s, pattern) | iterator | 迭代器多次发现的发现下一个实例模式(捕获),所以它可以用在一个通用的while循环。. |
其中一个要求是通常是削减从一个字符串两边的空白。在Lua中做的一个方法: | #!/usr/bin/lua
local strng = " Here I stand "
local rtrim = string.match(strng, ".*%S" )
local rltrim = string.match(ltrim, "%S.*" )
print (string. format ( "rltrim=>%s<" , rltrim))
结果输出:
<a href= "mailto:slitt@mydesk:~$" >slitt @mydesk :~$</a> ./test.lua
rltrim =>Here I stand<
slitt @mydesk :~$
|
让我们仔细检查前面。在右边的装饰,我们寻找一切直到最后的非空间(%s是一个非空字符,%s是一个空格字符)。但是为什么要等到最后的非空间而不是直到首先一个吗?这是因为Lua字符串包的默认行为是贪婪匹配意义的比赛,所有的方式到最后的例如你在寻找什么。因此在模式“%s。*”,它需要所有的字符直到最后的非空间。如果你想带他们直到首先非空间,你会用一个减号,而不是一个星号,所以它看起来像这样:“- %s。”。这被称为非贪婪匹配。这将是讨论关于“lua正则表达式”的页面。 无论如何,回到代码,还有修剪过的双方更简洁的方式,如下: | #!/usr/bin/lua
local strng = " Here I stand "
local rltrim = string.match(string.match(strng, "%S.*" ), ".*%S" )
print (string. format ( "rltrim=>%s<" , rltrim))
|
内部功能进行评估,第一,它的装饰空间了左。我认为这可能是快。内部功能通过结果作为一个函数返回,和外部功能上工作。输出如下: | slitt @mydesk :~$ ./test.lua
rltrim =>Here I stand<
slitt @mydesk :~$
|
最后一个例子,考虑下面的代码,以一个典型的一个关键的配置文件,一个等号,和一个值,并提取从它的键和值: 1 2 3 4 5 6 7 8 9 10 11 12 | #!/usr/bin/lua
local strng = " fullname = Mary Theresa Colleen Maureen McAllister "
local key = string.match(strng, "^.-=" )
key = string.sub(key, 1, -2)
key = string.match(key, ".*%S" )
key = string.match(key, "%S.*" )
local value = string.match(strng, "=.*$" )
value = string.match(value, "[^=%s].*" )
value = string.match(value, ".*%S" )
print(string.format( "strng=>%s<" , strng))
print(string.format( "key=>%s<" , key ))
print(string.format( "value=>%s<" , value))
|
这是一些丑陋的代码的人。在Lua“regex”课你会学会更容易,更整洁、更简洁的方式来做这样的事情。的以下是前面的输出: | slitt @mydesk :~$ ./test.lua
strng => fullname = Mary Theresa Colleen Maureen McAllister <
key =>fullname<
value =>Mary Theresa Colleen Maureen McAllister<
slitt @mydesk :~$
|
注意到这两个键和值已被修整,空白的两侧。
|