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' fva 00b fv' == 'a 00b') 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