字符串提取函数

这些方法也是从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--03字符串的更多相关文章

  1. lua工具库penlight--01简介

    lua的设计目标是嵌入式语言,所以和其它动态语言(如python.ruby)相比其自带的库缺少很多实用功能. 好在有lua社区有Penlight,为lua提供了许多强大的功能,接下来的几篇博客,我会简 ...

  2. lua工具库penlight--06数据(二)

    词法扫描 虽然 Lua 的字符串模式匹配是非常强大,但需要更强大的东西.pl.lexer.scan可以提供标记字符串,按标记机分类数字.字符串等. > lua -lpl Lua 5.1.4  C ...

  3. lua工具库penlight--09技术选择

    模块化和粒度 在理想的世界,一个程序应该只加载它需要的库.Penlight需要额外100 Kb 的字节码来工作.它是简单但却乏味要加载你需要什么: local data = require 'pl.d ...

  4. lua工具库penlight--08额外的库(一)

    额外的库 在这一节中的库不再被认为是Penlight的核心部分,但在需要时,仍提供专门的功能. 简单的输入的模式 Lua 的字符串模式匹配是非常强大,通常您将不需要传统的正则表达式库.即便如此,有时  ...

  5. lua工具库penlight--07函数编程(二)

    列表压缩 列表压缩是以紧凑的方式通过指定的元素创建表.在 Python里,你可以说: ls = [x for x in range(5)]  # == [0,1,2,3,4] 在 Lua,使用pl.c ...

  6. lua工具库penlight--04路径和目录

    使用路径 程序不应该依赖于奇葩的系统,这样你的代码会难以阅读和移植.最糟糕的是硬编码的路径, windows和Unix的路径分隔符正好相反.最好使用path.join,它可以帮助你解决这个问题. pl ...

  7. lua工具库penlight--02表和数组

    类Python的List lua的优美之处在于把数组和关联数组都用table实现了(Python中叫list和dict,C++中叫vector和map). 一般我们把数字索引的table叫做list. ...

  8. lua工具库penlight--07函数编程(一)

    函数编程 序列 Lua 迭代器 (最简单的形式) 是一个函数,可以多次调用返回一个或多个值.for in语句理解迭代器和循环,直到该函数将返回nil. Lua有标准的序列迭代器 (ipairs和pai ...

  9. lua工具库penlight--06数据(一)

    这篇太长了,分了两部分.(这个是机器翻译之后我又校对了一下,以后的都这样,人工翻译太累了.) 读数据文件 首先考虑清楚,你的确需要一个自定义的文件读入器吗?如果是,你能确定有能力写好吗? 正确,稳健, ...

随机推荐

  1. SQL OUTER JOIN

    When we want to select out all the record from two table, no matter it's present at second table or ...

  2. http://www.cnblogs.com/nick-huang/p/4848843.html

    http://www.cnblogs.com/nick-huang/p/4848843.html

  3. MyEclipse 如何最佳设置

    摘自: http://blog.csdn.net/lifuxiangcaohui/article/details/8513561 MyEclipse 如何最佳设置 作为企业级开发最流行的工具,用Mye ...

  4. html中块注释<!--[if IE]>….<![endif]--> (<!--[if !IE]>||<![endif]

    1. <!--[if !IE]><!--> 除IE外都可识别 <!--<![endif]-->2. <!--[if IE]> 所有的IE可识别 & ...

  5. UDP Sockets in C#

    UDP provides an end-to-end service different from that of TCP. In fact, UDP performs only two functi ...

  6. 流编辑器sed

    sed与grep一样,都起源于老式的ed编辑器,因其是一个流编辑器(stream editor)而得名.与vi等编辑器不同,sed是一种非交互式编辑器(即用户不必参与编辑过程),它使用预先设定好的编辑 ...

  7. STL之hashtable源代码剖析

    // Filename: stl_hashtable.h /////////////////////////////////////////////////////////////////////// ...

  8. 算法笔记_148:有向图欧拉回路求解(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 Description A catenym is a pair of words separated by a period such that t ...

  9. Git高速入门——Git安装、创建版本号库以及经常使用命令

    学习Git最全面的资料,在我看来是这本书--Pro Git,网上关于Git的教程有非常多,包含当中一些非常优秀的教程.这一系列的博客,主要是记录自己学习Git的经历.以及在这一过程中遇到的一些问题. ...

  10. 【Django】pip 安装和卸载 Django

    1.在dos命令中输入pip进行安装 注意:如果提示('pip' 不是内部或外部命令,也不是可运行的程序或批处理文件.) 那么先将pip添加到环境变量中,pip路径一般在python的安装路径下,例如 ...