2010-07-15 2 views
3

저는 Lua에서 string.find와 string.match의 차이점을 이해하려고합니다. 내게 그것은 문자열에서 패턴을 찾는 것처럼 보인다. 그러나 차이점은 무엇입니까? 그리고 어떻게 각각을 사용합니까? 말하자면, "Disk Space : 3000 kB"라는 문자열이 있는데, 나는 그것을 추출하기를 원합니다.Lua에서 string.find와 string.match의 차이점은 무엇입니까?

편집 : 좋아, 나는 복잡하게 생각하고 지금은 길을 잃은 것 같아. 지금까지이 작성한

my $mem; 
my $memfree; 
open(FILE, 'proc/meminfo'); 
while (<FILE>) 
{ 
    if (m/MemTotal/) 
    { 
     $mem = $_; 
     $mem =~ s/.*:(.*)/$1/; 
    } 
    elseif (m/MemFree/) 
    { 
     $memfree = $_; 
     $memfree =~ s/.*:(.*)/$1/; 
    } 
} 
close(FILE); 

: 기본적으로, 펄에서 루아에,이 번역해야

for Line in io.lines("/proc/meminfo") do 
    if Line:find("MemTotal") then 
     Mem = Line 
     Mem = string.gsub(Mem, ".*", ".*", 1) 
    end 
end 

을하지만 그것은 분명히 잘못된 것입니다. 나는 무엇을 얻지 못합니까? 나는 그것이 잘못된 이유를 이해하고, 실제로 무엇을하고 있는지 나는

print(Mem) 

을 수행 할 때 왜

.* 

을 반환하지만 나는 그것을 할 수있는 적절한 방법이 무엇인지 이해하지 않습니다. 정규식이 나를 혼란스럽게합니다!

local space = tonumber(("Disk Space 3000 kB"):match("Disk Space ([%.,%d]+) kB")) 

string.find 어떤 캡처를 반환하기 전에 점에서 약간 다른, 그것은 발견 된 문자열의 시작과 끝 인덱스를 반환합니다 : 귀하의 경우에는

답변

3

, 당신이 경우 String.match 원하는. 캡처가 없으면 string.match는 일치하는 전체 문자열을 반환하지만 string.find는 두 번째 반환 값을 지나치는 항목을 반환하지 않습니다. string.find는 'plain'매개 변수를 사용하여 루아 패턴을 인식하지 않고 문자열을 검색 할 수도 있습니다.

일치하는 캡처가 필요할 때 string.match를 사용하고 하위 문자열의 위치를 ​​원할 때 string.find를 사용하거나 위치와 캡처를 모두 원할 때 사용하십시오.

+0

감사합니다. 지금은 이해합니다. 내 교과서에서는 string.find (제목 문자열, 패턴 문자열, 선택적 시작 위치, 선택적 일반 플래그)를 정의했습니다. 필자가 이해 하듯이 선택적 시작 위치는 찾고자하는 패턴의 위치를 ​​반환하는 출력 변수가 아니라 검색을 시작하기를 원할 수있는 위치입니다. 아니면 그렇지? 왜냐하면 그렇지 않다면 나는 교과서 예제에 포지션이 반환되고 있다는 것에 눈치 채지 못했고 사과했다. – OddCore

+0

start position 매개 변수는 문자열에서 검색을 시작할 위치를 지정합니다. string.match와 string.find 모두에 사용할 수 있습니다. –

관련 문제