lua에서 find, gsub, format 사용시 % 문자 오류 대처법

개발/lua script1 2025. 11. 21. 13:08

Lua에서 문자열 다루실 때 %는 진짜 "지뢰"처럼 조심해야 하는 문자입니다.

크게 세 군데에서 헷갈리기 쉽습니다.

 


 

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에서 문자열 처리하실 때 %는 항상 "두 번 써야 하나?"를 한 번씩 의심해 보시는 게 좋습니다.

반응형
admin