【问题标题】:Lua help me optimize my pattern-matching functionLua 帮我优化我的模式匹配功能
【发布时间】:2021-10-28 12:54:33
【问题描述】:

有没有办法摆脱最后两个 gsub 并使这个函数对所有捕获模式使用单个替换表?

function sanitize(txt)
    local replacements = {
        ['&' ] = '&', 
        ['<' ] = '&lt;', 
        ['>' ] = '&gt;', 
        ['\n'] = '<br/>'
    }
    return txt
        :gsub('[&<>\n]', replacements)
        :gsub(' +', ' ')
        :gsub('%^%d', '')
end

【问题讨论】:

  • 在 Lua 模式中,不能使用交替。因此,您不能将 3 种模式合并为一个。
  • 但是他可以将最后两个作为字符串索引键放入替换表中,并让 gsub() 中的模式'.' 搜索替换。

标签: lua lua-patterns


【解决方案1】:

如果我理解正确,请执行类似...

function sanitize(txt)
    local replacements = {
        ['&'] = '&amp;', 
        ['<'] = '&lt;', 
        ['>'] = '&gt;', 
        ['\n'] = '<br/>',
        ['+'] = '',
        ['^'] = '',
        ['1'] = '',
        ['2'] = '',
        ['3'] = '',
        ['4'] = '',
        ['5'] = '',
        ['6'] = '',
        ['7'] = '',
        ['8'] = '',
        ['9'] = '',
        ['0'] = ''
    }
    return txt:gsub('.', replacements)
end

【讨论】:

  • 在初始代码中,最后两个 gsub 用于将“^1te^2st1^ 2string3^”之类的内容格式化为“test1^ 2string3”(捕获 ^%d 和多个空格),但您的解决方案可以“测试字符串”
【解决方案2】:

有没有办法让这个函数对所有捕获模式使用单个替换表?

是的。
但是你不想使用它:-)

function sanitize(txt)
   local replacements = {
      -- only up to 3 spaces; add more entries to this table for longer chains of spaces
      ['&' ] = '&amp;', ['& ' ] = '&amp; ', ['&  ' ] = '&amp; ', ['&   ' ] = '&amp; ',
      ['<' ] = '&lt;',  ['< ' ] = '&lt; ',  ['<  ' ] = '&lt; ',  ['<   ' ] = '&lt; ',
      ['>' ] = '&gt;',  ['> ' ] = '&gt; ',  ['>  ' ] = '&gt; ',  ['>   ' ] = '&gt; ',
      ['\n'] = '<br/>', ['\n '] = '<br/> ', ['\n  '] = '<br/> ', ['\n   '] = '<br/> ',
      ['  ' ] = ' ', ['   ' ] = ' ',

      ['0  '] = '0 ', ['0   '] = '0 ',
      ['1  '] = '1 ', ['1   '] = '1 ',
      ['2  '] = '2 ', ['2   '] = '2 ',
      ['3  '] = '3 ', ['3   '] = '3 ',
      ['4  '] = '4 ', ['4   '] = '4 ',
      ['5  '] = '5 ', ['5   '] = '5 ',
      ['6  '] = '6 ', ['6   '] = '6 ',
      ['7  '] = '7 ', ['7   '] = '7 ',
      ['8  '] = '8 ', ['8   '] = '8 ',
      ['9  '] = '9 ', ['9   '] = '9 ',

      ['^&' ] = '^&amp;', ['^& ' ] = '^&amp; ', ['^&  ' ] = '^&amp; ', ['^&   ' ] = '^&amp; ',
      ['^<' ] = '^&lt;',  ['^< ' ] = '^&lt; ',  ['^<  ' ] = '^&lt; ',  ['^<   ' ] = '^&lt; ',
      ['^>' ] = '^&gt;',  ['^> ' ] = '^&gt; ',  ['^>  ' ] = '^&gt; ',  ['^>   ' ] = '^&gt; ',
      ['^\n'] = '^<br/>', ['^\n '] = '^<br/> ', ['^\n  '] = '^<br/> ', ['^\n   '] = '^<br/> ',
      ['^ '] = ' ', ['^  '] = ' ', ['^   '] = ' ',

      ['^0'] = '', ['^0 '] = ' ', ['^0  '] = ' ', ['^0   '] = ' ',
      ['^1'] = '', ['^1 '] = ' ', ['^1  '] = ' ', ['^1   '] = ' ',
      ['^2'] = '', ['^2 '] = ' ', ['^2  '] = ' ', ['^2   '] = ' ',
      ['^3'] = '', ['^3 '] = ' ', ['^3  '] = ' ', ['^3   '] = ' ',
      ['^4'] = '', ['^4 '] = ' ', ['^4  '] = ' ', ['^4   '] = ' ',
      ['^5'] = '', ['^5 '] = ' ', ['^5  '] = ' ', ['^5   '] = ' ',
      ['^6'] = '', ['^6 '] = ' ', ['^6  '] = ' ', ['^6   '] = ' ',
      ['^7'] = '', ['^7 '] = ' ', ['^7  '] = ' ', ['^7   '] = ' ',
      ['^8'] = '', ['^8 '] = ' ', ['^8  '] = ' ', ['^8   '] = ' ',
      ['^9'] = '', ['^9 '] = ' ', ['^9  '] = ' ', ['^9   '] = ' ',
   }
   return txt:gsub('%^?[&<>\n%d ] *', replacements)
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-17
    • 2019-08-20
    • 2013-01-19
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多