string_Tips.lua 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. string.empty = ''
  2. function string.contains(str, subStr)
  3. return string.find(str, subStr) ~= nil
  4. end
  5. function string.endsWith(str, subStr)
  6. local len1 = #str
  7. local len2 = #subStr
  8. if len1 < len2 then
  9. return false
  10. end
  11. return string.find(str, subStr, len1 - len2 + 1) ~= nil
  12. end
  13. function string.isNullOrEmpty(str)
  14. return str == nil or str == ""
  15. end
  16. function string.replace(str, oldStr, newStr)
  17. local i, j = string.find(str, oldStr, 1, true)
  18. if i and j then
  19. ---@class ret
  20. local ret = {}
  21. local start = 1
  22. while i and j do
  23. table.insert(ret, string.sub(str, start, i - 1))
  24. table.insert(ret, newStr)
  25. start = j + 1
  26. i, j = string.find(str, oldStr, start, true)
  27. end
  28. table.insert(ret, string.sub(str, start))
  29. return table.concat(ret)
  30. end
  31. return str
  32. end
  33. function string.split(str, sep)
  34. sep = sep or " "
  35. local items = {}
  36. local pattern = string.format("([^%s]+)", sep)
  37. string.gsub(str, pattern, function (c)
  38. table.insert(items, c) end)
  39. return items
  40. end
  41. ---@param pattern string @例如 '<.->',里面的减号表示尽可能少,例如 abc<fdsafdsa>df<dddd> 分割后返回 abc <fdsafdsa> df <dddd>
  42. ---但是 abc<fdd<d>d> 会匹配成 abc <fdd<d> d>
  43. function string.splitPair(str,pattern)
  44. local items = {}
  45. --或者 %b<>
  46. local temp = {}
  47. for v in string.gmatch(str,pattern) do
  48. table.insert(temp,v)
  49. end
  50. local index = 1
  51. local tempIndex = 1
  52. local length = string.len(str)
  53. while index <= length and tempIndex<=#temp and not string.isNullOrEmpty(str) do
  54. local i = string.indexOf(str,temp[tempIndex])
  55. local pre = string.sub(str,1,i-1)
  56. if not string.isNullOrEmpty(pre) then
  57. table.insert(items,pre)
  58. end
  59. table.insert(items,temp[tempIndex])
  60. index = i+string.len(temp[tempIndex])
  61. str = string.sub(str,index)
  62. tempIndex = tempIndex+1
  63. index = i+1
  64. end
  65. if not string.isNullOrEmpty(str) then
  66. table.insert(items,str)
  67. end
  68. return items
  69. end
  70. ---@return table @abc<fdd<d>d> 会匹配成 abc <fdd<d>d> 完全匹配 left:'<' right:'>'
  71. function string.splitCompletePairMatch(str,left,right)
  72. local items = {}
  73. local index = 1
  74. local length = string.len(str)
  75. local leftCount = 0
  76. local preIndex = 1
  77. while index<=length do
  78. local c = string.sub(str,index,index)
  79. if c == left then
  80. if leftCount==0 then
  81. if preIndex<=index-1 then
  82. local pre = string.sub(str,preIndex,index-1)
  83. preIndex = index
  84. if not string.isNullOrEmpty(pre) then
  85. table.insert(items,pre)
  86. end
  87. end
  88. end
  89. leftCount = leftCount + 1
  90. elseif c == right then
  91. if leftCount~=0 then
  92. leftCount = leftCount - 1
  93. if leftCount==0 then
  94. local p = string.sub(str,preIndex,index)
  95. preIndex = index+1
  96. table.insert(items,p)
  97. end
  98. else
  99. local p = string.sub(str,preIndex,index)
  100. preIndex = index+1
  101. table.insert(items,p)
  102. end
  103. end
  104. index = index+1
  105. end
  106. if preIndex<=length then
  107. local p = string.sub(str,preIndex,length)
  108. table.insert(items,p)
  109. end
  110. return items
  111. end
  112. ---@return string[] @例如 分隔符/,111/aaa 分割之后是 111 /aaa
  113. function string.splitToArray(str,sep)
  114. local items = string.splitPair(str,sep)
  115. local t = {}
  116. local s=string.empty
  117. for k, v in pairs(items) do
  118. if v == sep then
  119. s = v
  120. elseif not string.isNullOrEmpty(s) then
  121. table.insert(t,s..v)
  122. s = string.empty
  123. else
  124. table.insert(t,v)
  125. end
  126. end
  127. return t
  128. end
  129. ---@return string[] @例如 helloWorld 分隔符llo 分割之后是he World
  130. function string.splitByAll(str, sep)
  131. if type(sep) ~= "string" or #sep <= 0 then
  132. return
  133. end
  134. local index = 1
  135. local strTb = {}
  136. while true do
  137. local pos = string.find(str, sep, index, true)
  138. if not pos then
  139. break
  140. end
  141. table.insert (strTb, string.sub (str, index, pos - 1))
  142. index = pos + string.len (sep)
  143. end
  144. table.insert (strTb, string.sub (str, index))
  145. return strTb
  146. end
  147. function string.getChar(str,index)
  148. return string.sub(str,index,index)
  149. end
  150. function string.startsWith(str, subStr)
  151. return string.find(str, subStr) == 1
  152. end
  153. local EMPTY_CHARS = " \t\n\r"
  154. function string.trim(str, chars)
  155. chars = chars or EMPTY_CHARS
  156. return str:match(string.format("^[%s]*(.-)[%s]*$", chars, chars))
  157. end
  158. function string.trimLeft(str, chars)
  159. chars = chars or EMPTY_CHARS
  160. return str:match(string.format("^[%s]*(.*)", chars))
  161. end
  162. function string.trimRight(str, chars)
  163. chars = chars or EMPTY_CHARS
  164. return str:match(string.format("(.-)[%s]*$", chars))
  165. end
  166. function string.indexOf(s, pattern, init)
  167. init = init or 0
  168. local index = string.find(s, pattern, init, true)
  169. return index or -1;
  170. end
  171. function string.lastIndexOf(s, pattern)
  172. local i=s:match(".*"..pattern.."()")
  173. if i==nil then
  174. return nil
  175. else
  176. return i-1
  177. end
  178. end
  179. ---@return string @顺序匹配是否包含
  180. function string.containsByOrder(str,subStr)
  181. local len = string.len(str)
  182. local subLen = string.len(subStr)
  183. local lenIndex = 1
  184. local subLenIndex = 1
  185. while subLenIndex<=subLen and lenIndex<=len do
  186. local subChar = string.getChar(subStr,subLenIndex)
  187. local char = string.getChar(str,lenIndex)
  188. if subChar == char then
  189. subLenIndex = subLenIndex+1
  190. lenIndex = 1
  191. else
  192. lenIndex = lenIndex+1
  193. end
  194. end
  195. if subLenIndex>=subLen then
  196. return true
  197. end
  198. return false
  199. end
  200. function string.insert(str,index,insertStr)
  201. local pre = string.sub(str, 1, index -1)
  202. local tail = string.sub(str, index, -1)
  203. local createStr = string.format("%s%s%s", pre, insertStr, tail)
  204. return createStr
  205. end
  206. --获取文件名
  207. function string.getFileName(filename)
  208. return string.match(filename, ".+/([^/]*%.%w+)$")
  209. end
  210. function string.getFileNameWithoutExtension(filename)
  211. return string.match(filename, ".+/([^/]*)%.%w+$")
  212. end
  213. --获取扩展名
  214. function string.getExtension(str)
  215. return str:match(".+%.(%w+)$")
  216. end
  217. ---@return string @减少无效匹配的gc分配
  218. function string.gsub_opti(s, pattern, repl, n)
  219. if string.contains(s,pattern) then
  220. return string.gsub(s, pattern, repl, n)
  221. else
  222. return s
  223. end
  224. end
  225. ---@return string @减少无效匹配的gc分配
  226. function string.gmatch_opti(s, pattern)
  227. if string.contains(s,pattern) then
  228. return string.gmatch(s, pattern)
  229. else
  230. return nil
  231. end
  232. end