1. 程式人生 > >用Lua實現string的trim()方法

用Lua實現string的trim()方法

abcd implement rate module posit time cor ring targe

  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 gsubs
 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 theres 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 Robertos 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(trima == a) 119 assert(trim a == a) 120 assert(trima == 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

用Lua實現string的trim()方法