zoukankan      html  css  js  c++  java
  • 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 》

  • 相关阅读:
    CF1539 VP 记录
    CF1529 VP 记录
    CF875C National Property 题解
    CF1545 比赛记录
    CF 1550 比赛记录
    CF1539E Game with Cards 题解
    CF1202F You Are Given Some Letters... 题解
    vmware Linux虚拟机挂载共享文件夹
    利用SOLR搭建企业搜索平台 之九(solr的查询语法)
    利用SOLR搭建企业搜索平台 之四(MultiCore)
  • 原文地址:https://www.cnblogs.com/daiker/p/5917276.html
Copyright © 2011-2022 走看看