lua에서 find, gsub, format 사용시 % 문자 오류 대처법
개발/lua script1 2025. 11. 21. 13:08Lua에서 문자열 다루실 때 %는 진짜 "지뢰"처럼 조심해야 하는 문자입니다.
크게 세 군데에서 헷갈리기 쉽습니다.
1. 패턴(string.find, gsub 등)에서의 %
Lua 패턴에서 %는 "특수 문자/클래스"를 뜻하는 이스케이프 문자입니다.
예시:
string.find("abc123", "%d+") -- 숫자 하나 이상(%d+)
string.find("Hello", "%a+") -- 알파벳 하나 이상(%a+)
그래서 진짜 % 문자 자체를 찾고 싶으면 한 번 더 이스케이프 해야 합니다.
local s = "value is 100% sure"
-- 잘못된 예: 여기서 %는 패턴 이스케이프라 에러 나거나 이상하게 동작
-- string.find(s, "%")
-- 올바른 예
local i = string.find(s, "%%")
print(i) -- %가 있는 위치
정리하면: 패턴 안에서
- %d, %a, %s 등 → "숫자", "알파벳", "공백" 같은 클래스
- %% → 진짜 % 문자 한 개
2. string.format 에서의 %
string.format에서도 %는 서식 지정자 시작입니다.
local msg = string.format("num = %d", 10)
-- 결과: "num = 10"
그래서 여기서도 그냥 %를 찍고 싶으면 %%를 써야 합니다.
local msg = string.format("진행률: %d%%", 80)
print(msg) -- "진행률: 80%"
- %d, %f, %s 등 → 서식 지정자
- %% → 출력 결과에 % 한 개
반응형
3. gsub 치환 문자열에서의 %
string.gsub의 치환 문자열(replacement) 에서 %1, %2 같은 건 "캡처 그룹"을 의미합니다.
local s = "name: lua"
local r = s:gsub("name: (.+)", "lang: %1")
print(r) -- "lang: lua"
여기서도 진짜 %를 넣고 싶으면 %% 를 써야 합니다.
local s = "rate: 80"
local r = s:gsub("rate: (%d+)", "rate: %1%%")
print(r) -- "rate: 80%"
4. 정리하자면
1) 패턴 함수(string.find, gsub, match 등)
- %d, %a, %s … : 특수 의미
- %% : 문자 % 자체
2) string.format
- %d, %f, %s … : 포맷 지정자
- %% : 문자 % 자체
3) gsub 치환 문자열
- %1, %2 … : 캡처 그룹
- %% : 문자 % 자체
실무에서 흔한 버그 패턴은 이런 식입니다:
-- "100%"를 찾고 싶은데…
text:find("100%") -- 잘못된 예 (패턴으로 인식됨)
text:find("100%%") -- 올바른 예
-- 진행률 로그 찍기
print(string.format("progress = %d%", progress)) -- 에러 또는 이상 동작
print(string.format("progress = %d%%", progress)) -- 정상: "progress = 50%"
요런 식으로 "패턴이냐, 포맷이냐, 그냥 문자열이냐"에 따라 %의 의미가 달라지니,
Lua에서 문자열 처리하실 때 %는 항상 "두 번 써야 하나?"를 한 번씩 의심해 보시는 게 좋습니다.
반응형




