字符串提取函数

这些方法也是从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. Node.js:创建应用+回调函数(阻塞/非阻塞)+事件循环

    一.创建应用 如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi.从这个角度看,整个"接收 HTTP ...

  2. Ubuntu挂载samba共享目录

    Ubuntu中现在没有smbfs了,所以smbmount命令也用不了了,现在可以使用mount.cifs命令来挂载. Usage:  mount.cifs <remotetarget> & ...

  3. Java开发新手经常遇到的一些问题

    A:java.lang.UnsupportedClassVersionError: Bad version number in .class file 解答:导致此问题的原因是Tomcat运行的JDK ...

  4. (转)Session URL重写

    Session URL重写 发表于 2012 年 3 月 5 日 Session URL重写,保证在客户端禁用或不支持COOKIE时,仍然可以使用Session session机制.session机制 ...

  5. public类型中internal成员

    今天遇到一问题,找到下面的两篇文章,研究比较深入,特转了一下, 最近除了搞ASP.NET MVC之外,我也在思考一些编程实践方面的问题.昨天在回家路上,我忽然对一个问题产生了较为清晰的认识.或者说,原 ...

  6. gem 更新源设置,ruby安装

    gem sources --remove http://rubygems.org/ gem sources -a http://ruby.taobao.org/ gem sources -l 结果只有 ...

  7. ftp protocol

    RFC http://www.w3.org/Protocols/rfc959/4_FileTransfer.html http://blog.chinaunix.net/uid-17238776-id ...

  8. UNIX网络编程卷2进程间通信读书笔记(一)—概述

    http://blog.chinaunix.net/uid-12868584-id-92807.html 写的灰常好,我就转载了 一.什么是进程间通信 IPC是进程间通信的简称,所谓进程通信,就是不同 ...

  9. centos 配置 samba 与windows共享文件夹

    yum install samba /etc/samba/smb.conf directory mask = 0777 ← 指定新建目录的属性(以下4行) force directory mode = ...

  10. 10 分钟实现一个自己的server监控器

    需求 近期须要给自己的server加入监控器.目的是监控server的内存.CPU.磁盘占用率,资源占用率过高的话能给自己发个提醒.当前主流的平台通常会提供邮件.短息.甚至会提供微信提醒,只是这类提醒 ...