字符串提取函数
这些方法也是从Python借鉴来的,但索引从1开始。stringx定义了一些函数如isalpha和isdigit,
用来判断字母和数字;startswith和endswith可以方便用来查找子串(endswith可以用来判断后缀
,如f:endswith{'.bat','.exe','.cmd'});还有对齐方法just和除去空白符的strip。
> stringx.import()
> ('bonzo.dog'):endswith {'.dog','.cat'}
true
> ('bonzo.txt'):endswith {'.dog','.cat'}
false
> ('bonzo.cat'):endswith {'.dog','.cat'}
true
> (' stuff'):ljust(20,'+')
'++++++++++++++ stuff'
> (' stuff '):lstrip()
'stuff '
> (' stuff '):rstrip()
' stuff'
> (' stuff '):strip()
'stuff'
> for s in ('one\ntwo\nthree\n'):lines() do print(s) end
one
two
three
此文还有许多其它威力强大的函数。
字符串模板
从python里还借鉴了字符串替换模板。
local Template = require ('pl.text').Template
t = Template('${here} is the $answer')
print(t:substitute {here = 'Lua', answer = 'best'})
==>
Lua is the best
"$ var"或者"${var}",可以用来连接文本,如果var没找到会抛出错误,safe_substitute函数则不会。
另外还有一个 indent_substitute可以方便的插入大块文本。这个函数提供了缩进。
local Template = require ('pl.text').Template
t = Template [[
for i = 1,#$t do
$body
end
]]
body = Template [[
local row = $t[i]
for j = 1,#row do
fun(row[j])
end
]]
print(t:indent_substitute {body=body,t='tbl'})
And the output is:
for i = 1,#tbl do
local row = tbl[i]
for j = 1,#row do
fun(row[j])
end
end
indent_substitute可以替换模板,这样参数本身可以被替换,所以$t被替换了两次。
pl.text还有dedent函数,用来出去多行字符串里的缩进(换行符之类的)。wrap函数可以
把传入的长字符串根据宽度转换为字符串表。indent用来切割多行字符串。
在Penlight 0.9里提供了text.format_operator,采用了Python风格的字符串格式化符%
> text.format_operator()
> = '%s[%d]' % {'dog',1}
dog[1]
它比string.format更简洁,通过用命名域还可以扩展$变量。
> = '$animal[$num]' % {animal='dog',num=1}
dog[1]
导入stringx.import后你要注意所有的strings共用相同的元表,不过在你的代码里你可以放心的
用提供的函数。
另一种风格的模板
另外一个模块是template(t小写),模仿自Rici Lake的Lua Preprocessor。它允许你把lua代码
和模板混合在一起。只有两条规则:
1、已#开头行的是lua代码
2、其它用$()包围的是lua表达式
如下一个生成html的模板如下:
<ul>
# for i,val in ipairs(T) do
<li>$(i) = $(val:upper())</li>
# end
</ul>
假设上面的文本在tmpl里,可以按如下方式展开模板:
local template = require 'pl.template'
res = template.substitute(tmpl,{T = {'one','two','three'}})
将会生成
<ul>
<li>1 = ONE</li>
<li>2 = TWO</li>
<li>3 = THREE</li>
</ul>
有一个简单的函数,template.substitute,它有两个参数模板字符串和环境表。环境表可以包含
一些特殊的域,如_parent 可以设置‘fallback’环境以防某个符合没找到。_brackets表示'()',_escape
表示'#'。有时候当处理重量级语言时,需要重定义这些接口,如$(V)在Make里有其它意义,#在
C/C++里表示预处理符。
最后,如果出错了,可以传入_debug产生lua代码dump。例如C代码生成。
local subst = require 'pl.template'.substitute
local templ = [[
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
> for _,f in ipairs(mod) do
static int l_$(f.name) (lua_State *L) {
}
> end
static const luaL_reg $(mod.name)[] = {
> for _,f in ipairs(mod) do
{"$(f.name)",l_$(f.name)},
> end
{NULL,NULL}
};
int luaopen_$(mod.name) {
luaL_register (L, "$(mod.name)", $(mod.name));
return 1;
}
]]
print(subst(templ,{
_escape = '>',
ipairs = ipairs,
mod = {
name = 'baggins';
{name='frodo'},
{name='bilbo'}
}
}))
文件I/O风格的字符串
pl.stringio提供了三个函数; stringio.open处理传入的字符串,返回文件的对象供读写。
它提供了read方法,参数和标准文件对象一样。
> f = stringio.open 'first line\n10 20 30\n'
> = f:read()
first line
> = f:read('*n','*n','*n')
10 20 30
同样也支持lines和seek.
stringio.create 可以创建一个可写的类文件的对象。现在你可以使用write写字符串流。
最后可以使用value提取字符串。这个’string builder‘模式可以方便创建大字符串。
原文:http://stevedonovan.github.io/Penlight/api/topics/03-strings.md.html
- lua工具库penlight--01简介
lua的设计目标是嵌入式语言,所以和其它动态语言(如python.ruby)相比其自带的库缺少很多实用功能. 好在有lua社区有Penlight,为lua提供了许多强大的功能,接下来的几篇博客,我会简 ...
- lua工具库penlight--06数据(二)
词法扫描 虽然 Lua 的字符串模式匹配是非常强大,但需要更强大的东西.pl.lexer.scan可以提供标记字符串,按标记机分类数字.字符串等. > lua -lpl Lua 5.1.4 C ...
- lua工具库penlight--09技术选择
模块化和粒度 在理想的世界,一个程序应该只加载它需要的库.Penlight需要额外100 Kb 的字节码来工作.它是简单但却乏味要加载你需要什么: local data = require 'pl.d ...
- lua工具库penlight--08额外的库(一)
额外的库 在这一节中的库不再被认为是Penlight的核心部分,但在需要时,仍提供专门的功能. 简单的输入的模式 Lua 的字符串模式匹配是非常强大,通常您将不需要传统的正则表达式库.即便如此,有时 ...
- lua工具库penlight--07函数编程(二)
列表压缩 列表压缩是以紧凑的方式通过指定的元素创建表.在 Python里,你可以说: ls = [x for x in range(5)] # == [0,1,2,3,4] 在 Lua,使用pl.c ...
- lua工具库penlight--04路径和目录
使用路径 程序不应该依赖于奇葩的系统,这样你的代码会难以阅读和移植.最糟糕的是硬编码的路径, windows和Unix的路径分隔符正好相反.最好使用path.join,它可以帮助你解决这个问题. pl ...
- lua工具库penlight--02表和数组
类Python的List lua的优美之处在于把数组和关联数组都用table实现了(Python中叫list和dict,C++中叫vector和map). 一般我们把数字索引的table叫做list. ...
- lua工具库penlight--07函数编程(一)
函数编程 序列 Lua 迭代器 (最简单的形式) 是一个函数,可以多次调用返回一个或多个值.for in语句理解迭代器和循环,直到该函数将返回nil. Lua有标准的序列迭代器 (ipairs和pai ...
- lua工具库penlight--06数据(一)
这篇太长了,分了两部分.(这个是机器翻译之后我又校对了一下,以后的都这样,人工翻译太累了.) 读数据文件 首先考虑清楚,你的确需要一个自定义的文件读入器吗?如果是,你能确定有能力写好吗? 正确,稳健, ...
随机推荐
- Linux挂载命令mount用法及参数详解
导读 mount是Linux下的一个命令,它可以将分区挂接到Linux的一个文件夹下,从而将分区和该目录联系起来,因此我们只要访问这个文件夹,就相当于访问该分区了. 挂接命令(mount) 首先,介绍 ...
- java中构建同时兼容linux和windows程序时遇到的文件路径分割符问题解决方案
最近在做一个自动上传文件的客户端,因为 file.getAbsolutePath() 在Mac和linux下的分割符是“/”,而在windows操作系统下的分割符则是“\”,我们程序中固然可以通过调 ...
- linux查看当前shell的方法
这篇文章主要对比一下 source 命令执行shell文件和 ./ping.sh 这种方式执行shell文件的区别. 1. source ping.sh 这个是在当前的shell 中执行 ping ...
- C# 使用int.TryParse,Convert.ToInt32,(int)将浮点类型转换整数时的区别
int.TryParse,Convert.ToInt32,(int) 这几种类型在将浮点类型转换整数时是有差别 Convert.ToInt32则会进行四舍五入 int.TryParse只能转换整数,即 ...
- 【Hibernate一】概述及入门
Hibernate学习框架: 1.基本部分 crud的操作 主键的生成机制 类型 持久化类 映射文件 *.hbm.xml 配置文件 hibe ...
- python 网络请求类库 requests 使用
python 网络请求类库 requests 使用 requests是 为python封装的强大 REST 操作类库 githubhttps://github.com/kennethreitz/req ...
- hyper-v虚拟网络配置
今天重新整整几个月前装的hyper-v,系统早已经装好但是网络不通. hyper-v虚拟网络分为3种:外部网络,内部网络和专用网络. 外部网络:虚拟机可以连接主机和外部网络. 内部网络:虚拟机可以连接 ...
- UNIX网络编程读书笔记:字节操纵函数
#include <strings.h> void bzero(void *dest, size_t nbytes); void bcopy(const void *src, void * ...
- QtGui.QLineEdit
A QtGui.QLineEdit is a widget that allows to enter and edit a single line of plain text. There are u ...
- QtGui.QCalendarWidget
A QtGui.QCalendarWidget provides a monthly based calendar widget. It allows a user to select a date ...