分享

lua简单字符串处理

 浪子小新 2017-04-18

本文内容向导

  • 介绍
  • 字符串连接与构造
  • 字符串格式
  • 大小写转换
  • 分割字符串位置
  • 查找子符串

介绍

我认为,当涉及到字符串处理,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:~$

注意到这两个键和值已被修整,空白的两侧。


除声明外,跑步客文章均为原创,转载请以链接形式标明本文地址

本文地址:  http://www./develop/lua/pbk1179.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多