main.lua 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. local string = string
  2. local sfind = string.find
  3. local slen = string.len
  4. local ssub = string.sub
  5. local sgub = string.gsub
  6. local sformat = string.format
  7. local setmetatable = setmetatable
  8. local tinsert = table.insert
  9. string.split1 = function (szFullString, szSeparator)
  10. local nFindStartIndex = 1
  11. local nSplitIndex = 1
  12. local nSplitArray = {}
  13. while true do
  14. local nFindLastIndex = string.find(szFullString, szSeparator, nFindStartIndex)
  15. if not nFindLastIndex then
  16. nSplitArray[nSplitIndex] = string.sub(szFullString, nFindStartIndex, string.len(szFullString))
  17. break
  18. end
  19. nSplitArray[nSplitIndex] = string.sub(szFullString, nFindStartIndex, nFindLastIndex - 1)
  20. nFindStartIndex = nFindLastIndex + string.len(szSeparator)
  21. nSplitIndex = nSplitIndex + 1
  22. end
  23. return nSplitArray
  24. end
  25. function string.split2(szFullString, szSeparator)
  26. local nFindStartIndex = 1
  27. local nSplitIndex = 1
  28. local nSplitArray = {}
  29. while true do
  30. local nFindLastIndex = sfind(szFullString, szSeparator, nFindStartIndex)
  31. if not nFindLastIndex then
  32. nSplitArray[nSplitIndex] = ssub(szFullString, nFindStartIndex, slen(szFullString))
  33. break
  34. end
  35. nSplitArray[nSplitIndex] = ssub(szFullString, nFindStartIndex, nFindLastIndex - 1)
  36. nFindStartIndex = nFindLastIndex + 1
  37. nSplitIndex = nSplitIndex + 1
  38. end
  39. return nSplitArray
  40. end
  41. function string.split3(str, sep)
  42. local parts = {__index = tinsert}
  43. setmetatable(parts, parts)
  44. sgub(str, sformat("([^%s]+)", sep), parts)
  45. setmetatable(parts, nil)
  46. parts.__index = nil
  47. return parts
  48. end
  49. function string.split4(str, sep)
  50. local ary = {}
  51. sgub(str, sformat("([^%s]+)", sep), function(c) ary[#ary+1] = c end)
  52. return ary
  53. end
  54. function string.split6(str, mark)
  55. mark = mark or ",";
  56. local setStr = {};
  57. local marklen = string.len(mark);
  58. local slength = string.len(str);
  59. local index = 0
  60. local start = 1
  61. while true do
  62. index = string.find(str, mark, start) -- find 'next' 返回 i 和 j
  63. if index == nil then break end
  64. local s = string.sub(str, start, index-1)
  65. table.insert(setStr, s)
  66. start = index + marklen;
  67. end
  68. if start <= slength then
  69. local s = string.sub(str, start, slength)
  70. table.insert(setStr, s)
  71. end
  72. return setStr;
  73. end
  74. local s_ary = {}
  75. local s_i = 1
  76. local function func(c)
  77. s_ary[s_i] = c
  78. s_i = s_i + 1
  79. end
  80. function string.split5(str, sep)
  81. s_ary = {}
  82. s_i = 1
  83. sgub(str, sformat("([^%s]+)", sep), func)
  84. return s_ary
  85. end
  86. local s = "1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20"
  87. local t = os.clock()
  88. for i = 1, 100000 do
  89. local x = string.split1(s, "+")
  90. end
  91. print("string.split: " ,os.clock() - t)
  92. t = os.clock()
  93. for i = 1, 100000 do
  94. local x = string.split2(s, "+")
  95. end
  96. print("string.split2: " , os.clock() - t)
  97. t = os.clock()
  98. for i = 1, 100000 do
  99. local x = string.split3(s, "+")
  100. end
  101. print("string.split3: " , os.clock() - t)
  102. t = os.clock()
  103. for i = 1, 100000 do
  104. local x = string.split4(s, "+")
  105. end
  106. print("string.split4: " , os.clock() - t)
  107. t = os.clock()
  108. for i = 1, 100000 do
  109. local x = string.split5(s, "+")
  110. end
  111. print("string.split5: " , os.clock() - t)
  112. t = os.clock()
  113. for i = 1, 100000 do
  114. local x = string.split6(s, "+")
  115. end
  116. print("string.split6: " , os.clock() - t)
  117. os.execute("PAUSE")