Tabs detab在Lua中是如何工作的 --将制表符转换为空格 函数detab(文本) 本地制表符宽度=4 本地功能代表(匹配) 局部空间=-match:len() 打印(“匹配:“…匹配”) 而空格

Tabs detab在Lua中是如何工作的 --将制表符转换为空格 函数detab(文本) 本地制表符宽度=4 本地功能代表(匹配) 局部空间=-match:len() 打印(“匹配:“…匹配”) 而空格,tabs,lua,spaces,Tabs,Lua,Spaces,来回答奖金问题: 制表符与制表符对齐。制表符由八个字符组成。第一个选项卡从第六列开始,因此需要填充三个空格。第二个选项卡从第16列开始,因此它只需要一个空格宽 当空格变为正数时,循环停止,因为循环一直以“缩进”增量添加空格,直到有足够的空格比匹配的文本长。然后,当它将该数量的空格与匹配的文本组合在一起时,它就构造了一个字符串,该字符串被填充到正确的制表位 这也是gsub不同的原因。gsub没有将制表符视为制表符,而是将其视为四个空格。因此,第二个制表符没有填充到制表位,而是扩展到四个空格。要回答

来回答奖金问题: 制表符与制表符对齐。制表符由八个字符组成。第一个选项卡从第六列开始,因此需要填充三个空格。第二个选项卡从第16列开始,因此它只需要一个空格宽

当空格变为正数时,循环停止,因为循环一直以“缩进”增量添加空格,直到有足够的空格比匹配的文本长。然后,当它将该数量的空格与匹配的文本组合在一起时,它就构造了一个字符串,该字符串被填充到正确的制表位


这也是gsub不同的原因。gsub没有将制表符视为制表符,而是将其视为四个空格。因此,第二个制表符没有填充到制表位,而是扩展到四个空格。

要回答额外的问题: 制表符与制表符对齐。制表符由八个字符组成。第一个选项卡从第六列开始,因此需要填充三个空格。第二个选项卡从第16列开始,因此它只需要一个空格宽

当空格变为正数时,循环停止,因为循环一直以“缩进”增量添加空格,直到有足够的空格比匹配的文本长。然后,当它将该数量的空格与匹配的文本组合在一起时,它就构造了一个字符串,该字符串被填充到正确的制表位


这也是gsub不同的原因。gsub没有将制表符视为制表符,而是将其视为四个空格。因此,第二个制表符没有填充到制表位,而是扩展到四个空格。

通过分析
rep
函数,它似乎就是这样做的。首先,它获取传入的匹配字符串的长度并将其设置为负值(例如,将其乘以-1)。在while循环中,它不断增加空间,直到它变为正

使用数字行可能更容易将其可视化:

-- Converts tabs to spaces
function detab(text)
    local tab_width = 4
    local function rep(match)
        local spaces = -match:len()
        print("match:"..match)
        while spaces<1 do spaces = spaces + tab_width end
        print("Found "..spaces.." spaces")
        return match .. string.rep(" ", spaces)
    end
    text = text:gsub("([^\n]-)\t", rep)
    return text
end


str='   thisisa string'
--thiis is a      string

print("length: "..str:len())
print(detab(str))
print(str:gsub("\t","    "))
这不同于outter
str:gsub(“\t”,”)
不加区别地用4个空格替换所有制表符。在
detab
函数中,替换制表符的空格数取决于匹配捕获的长度

local function rep(match)
  local spaces = tab_width - match:len() % tab_width

  return match .. string.rep(" ", spaces)
end

通过分析
rep
函数,它似乎就是这样做的。首先,它获取传入的匹配字符串的长度并将其设置为负值(例如,将其乘以-1)。在while循环中,它不断增加空间,直到它变为正

使用数字行可能更容易将其可视化:

-- Converts tabs to spaces
function detab(text)
    local tab_width = 4
    local function rep(match)
        local spaces = -match:len()
        print("match:"..match)
        while spaces<1 do spaces = spaces + tab_width end
        print("Found "..spaces.." spaces")
        return match .. string.rep(" ", spaces)
    end
    text = text:gsub("([^\n]-)\t", rep)
    return text
end


str='   thisisa string'
--thiis is a      string

print("length: "..str:len())
print(detab(str))
print(str:gsub("\t","    "))
这不同于outter
str:gsub(“\t”,”)
不加区别地用4个空格替换所有制表符。在
detab
函数中,替换制表符的空格数取决于匹配捕获的长度

local function rep(match)
  local spaces = tab_width - match:len() % tab_width

  return match .. string.rep(" ", spaces)
end

函数中
rep(匹配)
计算的
空格的等效形式
无循环:
local spaces=tab_width-#match%tab_width
函数中
spaces
计算的等效形式
rep(匹配)
没有循环:
局部空格=制表符宽度-#匹配%tab\u宽度
你是指不加区分的吗?你是指不加区分的吗?