diff options
| author | ruki <[email protected]> | 2019-06-04 22:41:25 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2019-06-04 10:08:31 +0800 |
| commit | 18663d52e5ff484eea423f88cbf52cc10c5721f3 (patch) | |
| tree | 3e1e147713b4ca50276b676b9b346f52f893708b /xmake/core/base | |
| parent | 255d51be7e7ed10a13a4cd55b5aae55079ab4bb9 (diff) | |
improve string.split
Diffstat (limited to 'xmake/core/base')
| -rw-r--r-- | xmake/core/base/colors.lua | 4 | ||||
| -rw-r--r-- | xmake/core/base/interpreter.lua | 8 | ||||
| -rw-r--r-- | xmake/core/base/string.lua | 39 |
3 files changed, 37 insertions, 14 deletions
diff --git a/xmake/core/base/colors.lua b/xmake/core/base/colors.lua index 8c5b2c287..2223c3f85 100644 --- a/xmake/core/base/colors.lua +++ b/xmake/core/base/colors.lua @@ -324,7 +324,7 @@ function colors.translate(str) end -- split words - local blocks_raw = word:split("%s+") + local blocks_raw = word:split("%s") -- translate theme color first, e.g ${color.error} local blocks = {} @@ -332,7 +332,7 @@ function colors.translate(str) if theme then local theme_block = theme:get(block) if theme_block then - for _, theme_block_sub in ipairs(theme_block:split("%s+")) do + for _, theme_block_sub in ipairs(theme_block:split("%s")) do table.insert(blocks, theme_block_sub) end else diff --git a/xmake/core/base/interpreter.lua b/xmake/core/base/interpreter.lua index 029fe3e60..01d76973e 100644 --- a/xmake/core/base/interpreter.lua +++ b/xmake/core/base/interpreter.lua @@ -119,7 +119,7 @@ function interpreter._fetch_root_scope(root) for scope_kind_and_name, _ in pairs(root or {}) do -- is scope_kind@@scope_name? - scope_kind_and_name = scope_kind_and_name:split("@@") + scope_kind_and_name = scope_kind_and_name:split("@@", {plain = true}) if #scope_kind_and_name == 2 then local scope_kind = scope_kind_and_name[1] local scope_name = scope_kind_and_name[2] @@ -1413,7 +1413,7 @@ function interpreter:api_define(apis) -- get api function local apiscope = nil local funcname = nil - apifunc = apifunc:split('.') + apifunc = apifunc:split('.', {plain = true}) assert(apifunc) if #apifunc == 2 then apiscope = apifunc[1] @@ -1470,7 +1470,7 @@ function interpreter:api_builtin_set_xmakever(minver) end -- parse minimum version - local minvers = minver:split('.') + local minvers = minver:split('.', {plain = true}) if not minvers or #minvers ~= 3 then os.raise("[nobacktrace]: set_xmakever(\"%s\"): invalid version format!", minver) end @@ -1479,7 +1479,7 @@ function interpreter:api_builtin_set_xmakever(minver) local minvers_num = minvers[1] * 100 + minvers[2] * 10 + minvers[3] -- parse current version - local curvers = xmake._VERSION_SHORT:split('.') + local curvers = xmake._VERSION_SHORT:split('.', {plain = true}) -- make current numerical version local curvers_num = curvers[1] * 100 + curvers[2] * 10 + curvers[3] diff --git a/xmake/core/base/string.lua b/xmake/core/base/string.lua index b27d076d5..878a2f683 100644 --- a/xmake/core/base/string.lua +++ b/xmake/core/base/string.lua @@ -143,19 +143,42 @@ function string:find_last(pattern, plain) end end --- split string with the given characters +-- split string with the given substring/characters -- +-- pattern match and ignore empty string -- ("1\n\n2\n3"):split('\n') => 1, 2, 3 --- ("1\n\n2\n3"):split('\n', true) => 1, , 2, 3 +-- ("abc123123xyz123abc"):split('123') => abc, xyz, abc +-- ("abc123123xyz123abc"):split('[123]+') => abc, xyz, abc -- -function string:split(delimiter, strict) +-- plain match and ignore empty string +-- ("1\n\n2\n3"):split('\n', {plain = true}) => 1, 2, 3 +-- ("abc123123xyz123abc"):split('123', {plain = true}) => abc, xyz, abc +-- +-- pattern match and contains empty string +-- ("1\n\n2\n3"):split('\n', {strict = true}) => 1, , 2, 3 +-- ("abc123123xyz123abc"):split('123', {strict = true}) => abc, , xyz, abc +-- ("abc123123xyz123abc"):split('[123]+', {strict = true}) => abc, xyz, abc +-- +-- plain match and contains empty string +-- ("1\n\n2\n3"):split('\n', {plain = true, strict = true}) => 1, , 2, 3 +-- ("abc123123xyz123abc"):split('123', {plain = true, strict = true}) => abc, , xyz, abc +-- +function string:split(delimiter, opt) local result = {} - if strict then - for match in (self .. delimiter):gmatch("(.-)" .. delimiter) do - table.insert(result, match) + local start = 1 + local pos, epos = self:find(delimiter, start, opt and opt.plain) + while pos do + local substr = self:sub(start, pos - 1) + if #substr > 0 then + table.insert(result, substr) + elseif opt and opt.strict then + table.insert(result, substr) end - else - self:gsub("[^" .. delimiter .."]+", function(v) table.insert(result, v) end) + start = epos + 1 + pos, epos = self:find(delimiter, start, opt and opt.plain) + end + if start <= #self then + table.insert(result, self:sub(start)) end return result end |
