Lua에서 string.find 사용법
개발/lua script1 2025. 12. 4. 13:59Lua에서 문자열을 다루다 보면 특정 문자가 포함되어 있는지, 또는 어떤 위치에 있는지 확인해야 할 때가 있습니다.
이때 가장 많이 쓰는 함수가 바로 string.find 입니다.
처음 접하면 반환값이나 패턴 때문에 조금 헷갈릴 수 있어서, 기본 개념부터 예제까지 정리해보겠습니다.
1. string.find 기본 개념
string.find 는 문자열 안에서 패턴에 해당하는 부분의 시작 인덱스와 끝 인덱스를 찾아서 돌려줍니다.
없으면 nil 을 반환합니다.
local s = "hello world"
local start_idx, end_idx = string.find(s, "world")
print(start_idx, end_idx) -- 7 11
여기서 주의할 점이 있습니다.
- Lua의 문자열 인덱스는 1부터 시작합니다.
- 찾지 못하면 nil 이 오므로, if 문에서 바로 검사해도 됩니다.
if string.find(s, "abc") then
print("있음")
else
print("없음")
end
2. 패턴 매칭 여부 확인만 하고 싶다면
단순히 문자열이 포함되어 있는지만 보고 싶을 때는 반환값 중 start_idx만 확인하시면 충분합니다.
if string.find("apple", "app") then
print("포함됨")
end
3. 패턴 매칭(정규표현 비슷하지만 Lua 패턴)
string.find 는 기본적으로 Lua 패턴을 사용합니다. 일반 정규표현식과 비슷하지만 완전히 같진 않습니다.
예를 들어 숫자 하나를 찾는 패턴:
local s = "a1b2c3"
local start_idx, end_idx = string.find(s, "%d")
print(start_idx, end_idx) -- 2 2
- %d 숫자
- %a 영문자
- %s 공백
- %w 영문자+숫자
이런 식으로 Lua 패턴을 활용할 수 있습니다.
4. 패턴 기능을 끄고 "문자 그대로" 찾고 싶다면?
패턴이 불편한 경우가 많습니다. %, ., + 같은 문자가 들어가면 의도치 않게 패턴으로 동작할 수 있기 때문입니다.
이럴 때는 plain = true 옵션을 줍니다.
local s = "1+1=2"
local start_idx, end_idx = string.find(s, "1+1", 1, true)
print(start_idx, end_idx) -- 1 3
여기서 매개변수 의미는:
string.find(문자열, 찾을문자, 시작위치, plain옵션)
plain 옵션이 true면 패턴 대신 그대로 매칭합니다.
5. 찾기 시작 위치 지정
두 번째부터 검색하고 싶을 때가 있을 수 있습니다.
local s = "banana"
print(string.find(s, "na", 1)) -- 3 4
print(string.find(s, "na", 4)) -- 5 6
3번째 문자부터 찾을지, 4번째부터 찾을지에 따라 위치가 달라집니다.
6. 존재 여부 + 위치 같이 활용하는 패턴
예를 들어 ".log" 확장자를 가진 파일인지 확인하면서 확장자 위치까지 알고 싶을 때:
local filename = "system.log"
local start_idx, end_idx = string.find(filename, "%.log")
-- 패턴에서 . 는 아무 문자이기 때문에 %. 로 이스케이프
if start_idx then
print("로그 파일입니다.", "확장자 위치:", start_idx, end_idx)
end
7. string.match 와의 차이
string.match 와 혼동되는 경우가 많아서 둘의 역할을 간단히 비교해보겠습니다.
| 함수 | 반환값 | 특징 |
| string.find | 시작,끝 index | 패턴 위치를 찾을 때 사용 |
| string.match | 패턴에 매칭된 문자열 | 매칭된 내용 자체가 필요할 때 사용 |
예:
local s = "value=123"
print(string.find(s, "%d+")) -- 7 9
print(string.match(s, "%d+")) -- 123
반응형




