기본 연산
local s = "hello"
print(#s) -- 바이트 길이 (ASCII면 글자 수)
print(s:sub(1, 2)) -- "he" (1-based)
print(s:reverse())
유니코드 한글은 바이트 길이와 글자 수가 다릅니다. 이 사이트 문제는 대체로 ASCII/숫자 위주입니다.
match / gmatch
local a, b = ("3 5"):match("(%S+)%s+(%S+)")
for word in ("a b c"):gmatch("%S+") do
-- word
end
%가 클래스 이스케이프입니다. .는 임의 한 글자, %d는 숫자입니다.
PCRE 전체를 기대하지 마세요. Lua 패턴은 별개입니다.
gsub
local out = ("a-b-c"):gsub("-", "")
local n = select(2, ("aba"):gsub("a", "x")) -- 치환 횟수
함정
string.find는 시작·끝 인덱스를 반환합니다.- 패턴에 리터럴
-(등을 넣을 때 이스케이프를 확인하세요.
연습
lua-reverse / lua-palindrome처럼 전처리(gsub로 공백 제거) 후 비교하는 흐름을 연습장에서 재현하세요.
자주 쓰는 클래스
| 패턴 | 의미 |
|---|---|
%a | 문자 |
%d | 숫자 |
%s | 공백 |
%w | 알파벳·숫자 |
%S | 공백 아님 |
. | 임의 1바이트 |
+ * - | 반복 (탐욕/비탐욕 차이 있음) |
숫자 파싱
local n = tonumber(s)
if not n then return "err" end
match로 뽑은 조각도 tonumber하세요.
한 줄
> Lua 패턴 ≠ 정규식 전체. gmatch로 토큰, gsub로 청소.