• Chapter 21_5.2 tab扩展


      在Lua中,像这样()的空白捕获具有特殊意义。表示捕获它在目标字符串中的位置,返回一个数字:

    print(string.match("hello","()ll()"))  --> 3  5  --第一个()捕获当前字符串位置,第二个()是在匹配后捕获的位置

    这个示例与string.find得到的结果不一样,就因为第二个捕获的位置是在匹配之后的。

    在一个字符串中扩展tab(制表符):

    function expandTabs(s, tab)
        tab = tab or 8        -- tab的大小(默认是8)
        local corr = 0
        s = string.gsub(s,"()	",function(p) --匹配字符串中所有的"	",捕获它的位置。函数计算还需要多少空格才能达到整数倍tab的列。
                    local sp = tab - (p - 1 + corr)%tab  --先对位置减一,使其从0开始计数,然后加上corr以补偿前面的tab(每个tab的扩展都会影响后面的tab位置
                    corr = corr -1 + sp  --更新这个corr补偿值,用于下一个tab的修正,减一以去掉当前tab,再加上要添加的空格数sp。
                    return string.rep(" ",sp)
                end)
        return s
    end

    再看一下如何实现逆向操作,将空格转换为tab。

    第一个方法:通过空捕获来对位置进行操作

    第二个方法:可以在字符串中每8个字节后插入一个标记,无论该标记是否位于空格前,都用tab替换它:

    function unexpandTabs(s,tab)
        tab = tab or 8
        s = expandTabs(s)  --首先对字符串中所有的tab进行了扩展
        local pat = string.rep(".",tab)
        s = string.gsub(s,pat,"%01")   --在每tab个字符后添加一个标记(控制字符"1"),"%0"是捕获整个匹配项。
        s = string.gsub(s," +1","	")  --将所有以标记结尾的空格序列(" +"都替换为tab," +"表示至少一个空格。
        s = string.gsub(s,"1","")      --删除剩下的标记,即那些没有位于空格后的标记
        return s
    end

    以上内容来自:《Lua程序设计第二版》和《Programming in Lua  third edition 》

  • 相关阅读:
    lazy懒载入(延迟载入)UITableView
    POJ 3277 City Horizon
    Effective C++ Item 26 尽可能延后变量定义式的出现时间
    2014 百度之星题解1001
    搭建和測试Android JAVA NDK
    Oracle数据库案例整理-Oracle系统执行时故障-内存过少导致分配共享内存失败
    “以房养老”保险方案为啥行不通?
    Mysql上的RAC:Percona XtraDB Cluster负载均衡集群安装部署手冊
    mysql 数据库查询最后两条数据
    00109_反射概述
  • 原文地址:https://www.cnblogs.com/daiker/p/5917276.html
Copyright © 2020-2023  润新知