• 用Lua实现string的trim()方法


      1 function trim1(s)
      2   return (s:gsub("^%s*(.-)%s*$", "%1"))
      3 end
      4 -- from PiL2 20.4
      5 
      6 function trim2(s)
      7   return s:match "^%s*(.-)%s*$"
      8 end
      9 -- variant of trim1 (match)
     10 
     11 function trim3(s)
     12   return s:gsub("^%s+", ""):gsub("%s+$", "")
     13 end
     14 -- two gsub's
     15 
     16 function trim4(s)
     17   return s:match"^%s*(.*)":match"(.-)%s*$"
     18 end
     19 -- variant of trim3 (match)
     20 
     21 function trim5(s)
     22   return s:match'^%s*(.*%S)' or ''
     23 end
     24 -- warning: has bad performance when s:match'^%s*$' and #s is large
     25 
     26 function trim6(s)
     27   return s:match'^()%s*$' and '' or s:match'^%s*(.*%S)'
     28 end
     29 -- fixes performance problem in trim5.
     30 -- note: the '()' avoids the overhead of default string capture.
     31 -- This overhead is small, ~ 10% for successful whitespace match call
     32 -- alone, and may not be noticeable in the overall benchmarks here,
     33 -- but there's little harm either.  Instead replacing the first `match`
     34 -- with a `find` has a similar effect, but that requires localizing
     35 -- two functions in the trim7 variant below.
     36 
     37 local match = string.match
     38 function trim7(s)
     39   return match(s,'^()%s*$') and '' or match(s,'^%s*(.*%S)')
     40 end
     41 -- variant of trim6 (localize functions)
     42 
     43 local find = string.find
     44 local sub = string.sub
     45 function trim8(s)
     46   local i1,i2 = find(s,'^%s*')
     47   if i2 >= i1 then s = sub(s,i2+1) end
     48   local i1,i2 = find(s,'%s*$')
     49   if i2 >= i1 then s = sub(s,1,i1-1) end
     50   return s
     51 end
     52 -- based on penlight 0.7.2
     53 
     54 function trim9(s)
     55   local _,i1 = find(s,'^%s*')
     56   local i2 = find(s,'%s*$')
     57   return sub(s,i1+1,i2-1)
     58 end
     59 -- simplification of trim8
     60 
     61 function trim10(s)
     62   local a = s:match('^%s*()')
     63   local b = s:match('()%s*$', a)
     64   return s:sub(a,b-1)
     65 end
     66 -- variant of trim9 (match)
     67 
     68 function trim11(s)
     69  local n = s:find"%S"
     70  return n and s:match(".*%S", n) or ""
     71 end
     72 -- variant of trim6 (use n position)
     73 -- http://lua-users.org/lists/lua-l/2009-12/msg00904.html
     74 
     75 function trim12(s)
     76  local from = s:match"^%s*()"
     77  return from > #s and "" or s:match(".*%S", from)
     78 end
     79 -- variant of trim11 (performs better for all
     80 -- whitespace string). See Roberto's comments
     81 -- on ^%s*$" v.s. "%S" performance:
     82 -- http://lua-users.org/lists/lua-l/2009-12/msg00921.html
     83 
     84 do
     85  require 'lpeg'
     86  local space = lpeg.S' 	
    vf
    '
     87  local nospace = 1 - space
     88  local ptrim = space^0 * lpeg.C((space^0 * nospace^1)^0)
     89  local match = lpeg.match
     90  function trim13(s)
     91    return match(ptrim, s)
     92  end
     93 end
     94 -- lpeg.  based on http://lua-users.org/lists/lua-l/2009-12/msg00921.html
     95 
     96 do
     97  require 'lpeg'
     98  require 're'
     99  local ptrim = re.compile"%s* {(%s* %S+)*}"
    100  local match = lpeg.match
    101  function trim14(s)
    102    return match(ptrim, s)
    103  end
    104 end
    105 -- variant with re module.
    106 
    107 require 'trim'
    108 local trim15 = trim
    109 -- C implementation (see separate trim.c file)
    110 
    111 
    112 -- test utilities
    113 
    114 local function trimtest(trim)
    115   assert(trim'' == '')
    116   assert(trim' ' == '')
    117   assert(trim'  ' == '')
    118   assert(trim'a' == 'a')
    119   assert(trim' a' == 'a')
    120   assert(trim'a ' == 'a')
    121   assert(trim' a ' == 'a')
    122   assert(trim'  a  ' == 'a')
    123   assert(trim'  ab cd  ' == 'ab cd')
    124   assert(trim' 	
    fva00b 
    	
    fv' == 'a00b')
    125 end
    126 
    127 local function perftest(f, s)
    128   local time = os.clock  -- os.time or os.clock
    129   local t1 = time()
    130   for i=1,100000 do
    131     f(s)f(s)f(s)f(s)f(s)f(s)f(s)f(s)f(s)f(s)
    132   end
    133   local dt = time() - t1
    134   io.stdout:write(string.format("%4.1f",dt) .. ' ')
    135 end
    136 
    137 local trims = {trim1, trim2, trim3, trim4, trim5, trim6, trim7,
    138                trim8, trim9, trim10, trim11, trim12, trim13, trim14, trim15}
    139 
    140 -- correctness tests
    141 for _,trim in ipairs(trims) do
    142   trimtest(trim)
    143 end
    144 
    145 -- performance tests
    146 for j=1,3 do
    147   for i,trim in ipairs(trims) do
    148     io.stdout:write(string.format("%2d",i) .. ": ")
    149     perftest(trim,  "")
    150     perftest(trim,  "abcdef")
    151     perftest(trim,  "   abcdef   ")
    152     perftest(trim,  "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef")
    153     perftest(trim,  "  a b c d e f g h i j k l m n o p q r s t u v w x y z A B C ")
    154     perftest(trim,  "                               a                            ")
    155     perftest(trim,  "                                                            ")
    156     print()
    157   end
    158 end

    原文地址:http://lua-users.org/wiki/StringTrim

  • 相关阅读:
    VMware WorkStation 用 VMTools 官方下载地址 windows-vmtools tools-windows
    LeetCode Golang 9.回文数
    CentOS6.5中配置Rabbitmq3.6.6集群方案
    python之lambda、filter、map、reduce的用法讲解
    跨主机容器之间通信实现方式:etcd+flanned
    mongo3.4安装
    centos 时区的更改 UTC TO CST
    Elasticsearch5安装
    docker1.*.*版本安装
    使用weave来实现多宿主机中的docker容器之间通信
  • 原文地址:https://www.cnblogs.com/AaronBlogs/p/7429410.html
Copyright © 2020-2023  润新知