用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' \t\n\v\f\r'
 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' \t\r\n\f\va\000b \r\t\n\f\v' == 'a\000b')
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

posted @ 2017-08-25 19:17  AaronBlogs  阅读(9413)  评论(0编辑  收藏  举报