我认为,当涉及到字符串处理,Perl的凯迪拉克工业。但是Lua在字符串前面也不错.
级联Lua中使用两个操作符一样简单(..):
#!/usr/bin/lua local fname = "Barack" local lname = "Obama" local wholename = fname .. " " .. lname print (wholename) --Prints "Barack Obama" |
你可以建立一个字符串的字符都是一样的rep()字符串。以下所示:
前打印一行等号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 :~$ |
注意以下几点:
这里有一些你应该知道的其他事情:
记得% 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/lualocal 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 :~$ |
注意到这两个键和值已被修整,空白的两侧。
联系客服