Lua에서 string.find 사용법

개발/lua script1 2025. 12. 4. 13:59

Lua에서 문자열을 다루다 보면 특정 문자가 포함되어 있는지, 또는 어떤 위치에 있는지 확인해야 할 때가 있습니다.

이때 가장 많이 쓰는 함수가 바로 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

 

반응형
admin