문제

이 문자열이 Lua 스크립트에 있습니다.

one;two;;three;four;;five;;six;seven;

첫 번째 숯은 결코 세미콜론이 아닙니다. 중간 분리기는 단일 또는 이중 세미콜론 일 수 있으며 마지막 숯은 단일 세미콜론이 될 수 있습니다.

LUA 패턴 사용 (및 string.gsub()) : 중간에있는 이중 세미콜론과 일치하여 하나의 세미콜론을 하나로 교체하고 마지막 선택적 세미콜론을 삭제하려면 어떻게해야합니까?

출력은 다음과 같아야합니다.

one;two;three;four;five;six;seven

단일 패턴을 사용하여 가능합니까?

도움이 되었습니까?

해결책

하나의 패턴을 사용하여 다중 교체 ; 단일 ;, 마지막을 제거하고 다른 하나를 제거합니다 ; 이와 같다

local str = "one;two;;three;four;;five;;six;seven;"
local result = str:gsub(';+', ';'):gsub(';*$', '')

단일 패턴을 사용하는 한 가지 가능한 방법은 다음과 같습니다.

local result = (str .. ";;;"):gsub(";+", function(s) 
                                             if s == ";" or s == ";;" then 
                                                 return ";" 
                                             else 
                                                 return "" 
                                             end 
                                         end)

내가하려는 것은 세 가지를 추가하는 것입니다 ; 문자열의 끝까지 ; 하나로 교체해야합니다 ;. 그리고 더 ;(3 ~ 4 개일 수 있고 끝에 있어야합니다) 비어있는 문자열로 교체됩니다.

더 명확하므로 두 가지 패턴의 솔루션을 선호합니다.

다른 팁

이와 같은 것은 어떻습니까 :

function remove_extra_delim(s, delim)
    local t = {}
    for each in s:gmatch("[^"..delim.."]+") do
        table.insert(t, each)
    end
    return table.concat(t, delim)
end

teststr = "one;two;;three;four;;five;;six;seven;"
print(remove_extra_delim(teststr, ";"))

출력 :

하나; 둘; 셋; 4; 5; 여섯; 7 개

세미콜론의 양이 1 또는 2 인 경우 간단히 할 수 있습니다.

string:gsub(";;", ";")

그렇지 않으면 다른 대답이 할 것입니다.

약간 해킹되지만 트릭을 수행합니다.

x = test:gsub(";+(.?)",
  function(a)
    if a == "" then
      return ""
    else
      return ";" .. a
    end
  end)

(참고 : 나는 당신의 설명을 정확하게 따르고 있습니다. 그래서 이것들은 하나 또는 둘을 일치 시키지만, 2 세 이하, 그리고 최종 0 또는 1이지만 하나 이상은 아닙니다).

-- Method one uses two patterns but it's simpler and my preferred one
s = 'one;two;;three;four;;five;;six;seven;'
s = s:gsub(';;',';'):gsub(';?$','')
print(s)

-- Method two uses one pattern (if you really MUST use only one pattern)
s = 'one;two;;three;four;;five;;six;seven;'
s = (s..';'):gsub(';;',';')
s = s:sub(1,#s-1)
print(s)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top