Learning
레슨 6 / 8·3개 토픽

문자열 처리와 패턴 매칭

문자열 기본 함수

Lua의 string 라이브러리는 문자열 조작에 필요한 다양한 함수를 제공합니다. 문자열은 불변(immutable)이므로 변환 함수는 항상 새 문자열을 반환합니다.

lua
local s = "Hello, Lua World!"

-- 길이, 대소문자
print(#s)                    -- 17
print(string.upper(s))       -- "HELLO, LUA WORLD!"
print(string.lower(s))       -- "hello, lua world!"

-- 부분 문자열
print(string.sub(s, 1, 5))   -- "Hello"
print(string.sub(s, 8))      -- "Lua World!"
print(string.sub(s, -6))     -- "orld!"

-- 반복, 뒤집기
print(string.rep("Lua ", 3))     -- "Lua Lua Lua "
print(string.reverse("abcde"))   -- "edcba"

-- 문자열 포맷 (printf 스타일)
local name = "세계"
local year = 2024
print(string.format("안녕, %s! %d년입니다.", name, year))
-- "안녕, 세계! 2024년입니다."

-- 바이트 변환
print(string.byte("A"))         -- 65
print(string.char(65, 66, 67))  -- "ABC"

Lua 패턴 매칭

Lua는 정규표현식 대신 자체 패턴 문법을 사용합니다. 정규식보다 가볍지만 대부분의 텍스트 처리에 충분합니다. %가 이스케이프 문자로 사용됩니다.

lua
-- string.find: 패턴 찾기
local s = "오늘 날짜는 2024-03-15 입니다"
local start, finish = string.find(s, "%d+-%d+-%d+")
print(start, finish)  -- 패턴이 시작/끝 위치

-- string.match: 매칭된 값 추출
local date = string.match(s, "(%d+)-(%d+)-(%d+)")
print(date)  -- "2024" (첫 캡처)

local year, month, day = string.match(s, "(%d+)-(%d+)-(%d+)")
print(year, month, day)  -- "2024"  "03"  "15"

-- string.gmatch: 반복 매칭 (이터레이터)
local text = "사과 3개, 바나나 5개, 포도 12개"
for item, count in string.gmatch(text, "(%a+)%s+(%d+)개") do
    print(item .. ": " .. count)
end
-- 사과: 3
-- 바나나: 5
-- 포도: 12

string.gsub과 패턴 클래스

lua
-- string.gsub: 패턴 치환
local s = "Hello World 123"
print(string.gsub(s, "%d+", "NUM"))   -- "Hello World NUM"
print(string.gsub(s, "%u", "*"))      -- "*ello *orld 123"

-- 함수를 이용한 치환
local result = string.gsub("price: $100, tax: $15", "%$(%d+)",
    function(n)
        return "$" .. tostring(tonumber(n) * 1.1)
    end
)
print(result)  -- "price: $110.0, tax: $16.5"

-- 주요 패턴 클래스
-- %a  문자(알파벳)       %A  문자가 아닌 것
-- %d  숫자              %D  숫자가 아닌 것
-- %w  알파벳+숫자        %W  알파벳+숫자가 아닌 것
-- %s  공백              %S  공백이 아닌 것
-- %p  구두점             %l  소문자  %u  대문자
-- .   아무 문자          %   이스케이프
-- *   0회 이상           +   1회 이상
-- -   0회 이상(최소)      ?   0 또는 1회
  • string.find(s, pattern) — 패턴 위치 찾기 (start, end 반환)
  • string.match(s, pattern) — 패턴 매칭 결과 반환
  • string.gmatch(s, pattern) — 반복 매칭 이터레이터
  • string.gsub(s, pattern, repl) — 패턴 치환
  • string.format(fmt, ...) — printf 스타일 포맷팅
  • %d, %a, %w, %s — 패턴 클래스 (대문자는 반대)
💡

Lua 패턴에서 특수문자(., %, ( 등)를 리터럴로 매칭하려면 %로 이스케이프하세요. 예: %.은 실제 점을 매칭합니다.