简体   繁体   中英

facing issue in lua code

How can I match "words" mixed parenthesis delimited strings, on the basis that they are separated by whitespaces. EG:

split_words_and_parenthesis("1791 (AR6K Async) S 2 ") --> {"1791","AR6K Async","S","2"}

Here's my attempt: str = "1791 (AR6K Async) S 2 "

for val in str:gmatch("%S+") do
  if str:gmatch("(" )then
    str:gsub("%b()" , function(s)  val=s end)
    print(val)
  else
    print(val)
  end
end

output:

(AR6K Async)                
(AR6K Async)             
(AR6K Async)             
(AR6K Async)       
(AR6K Async)

Can be solved using string.match if you know the format:

str = "1791 (AR6K Async) S 2 "

s1 = str:match("(%d%d%d%d)%s%(.*%)%s.+%s.+")
s2 = str:match("%d%d%d%d%s(%(.*%))%s.+%s.+")
s3 = str:match("%d%d%d%d%s%(.*%)%s(.+)%s.+")
s4 = str:match("%d%d%d%d%s%(.*%)%s.+%s(.+)")

print(s1)
print(s2)
print(s3)
print(s4)

Another solution that is generic and allows for variable number of entries (try it: simply past in a lua interpreter):

function get_separate_words(str)
    local i = 1
    local words = {}

    function get_parentheses_content(str,is_recursively_called)
        local i = 1
        local function split(s, sep)
            local fields = {}

            local sep = sep or ":"
            local pattern = string.format("([^%s]+)", sep)
            string.gsub(s, pattern, function(c) fields[#fields + 1] = c end)

            return fields
        end

        for j = 1,#str do
            local c = string.sub(str,j,j)
            local d = string.sub(str,j+1,j+1)
            if j <= i then
            elseif c == "(" then
                i = j + #get_parentheses_content(string.sub(str,j+1,#str),true) + 2
            elseif c == ")" and (is_recursively_called or (d == " ") or (not d)) then
            print('c')
                local parentheses_content = string.sub(str,1,j-1)
                return {parentheses_content}
            end
        end
        local parentheses_content = string.match(str,"^(.*)%)%s+[^)]*$")
        if parentheses_content then print('a') end
        parentheses_content = parentheses_content or string.match(str,"^(.*)%)$")
        if parentheses_content then
        print("A")
            return {parentheses_content}
        else
        print("B")
            return split("("..str," ")
        end
    end

    local function merge(table_a, table_b)
        table_a = table_a or {}
        table_b = table_b or {}

        for k_b, v_b in pairs(table_b) do
            if type(v_b) == "table" and type(table_a[k_b] or false) == "table" then
                merge(table_a[k_b], table_b[k_b])
            else
                table_a[k_b] = v_b
            end
        end

        return table_a
    end

    for j = 1,#str do
        local c = string.sub(str,j,j)
        if j < i then
        elseif c == " " or j == #str then
            local word = string.gsub(string.sub(str,i,j)," ","")
            if #word > 0 then
                table.insert(words, word)
                print(word)
            end
            i = j+1
        elseif c == "(" then
            local all_characters_after_opening_parentheses = string.sub(str,j+1,#str)
            local parentheses_content = get_parentheses_content(all_characters_after_opening_parentheses)[1]
            table.insert(words, parentheses_content)
            j= j+#parentheses_content+2
            i = j
        end
    end
    return words
end

separate_words = get_separate_words("1791 (AR6(K As)ync) S 2 )")

for k,v in ipairs(separate_words) do print(k,v) end

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM