수색…


통사론

  • string.find (str, pattern [, init [, plain]]) - str에서 일치하는 시작과 끝 인덱스를 반환합니다.

  • string.match (str, pattern [, index]) - 패턴을 한 번 일치시킵니다 (인덱스에서 시작).

  • string.gmatch (str, pattern) - str의 모든 일치를 반복하는 함수를 반환합니다.

  • string.gsub (str, pattern, repl [, n]) - 부분 문자열을 대체합니다 (최대 n 번까지).

  • . 모든 문자를 나타냅니다.

  • %a 는 모든 문자를 나타냅니다.

  • %l 은 모두 소문자를 나타냅니다.

  • %u 는 모두 대문자를 나타냅니다.

  • %d 은 모든 숫자를 나타냅니다.

  • %x 는 모든 16 진수를 나타냅니다.

  • %s 는 모든 공백 문자를 나타냅니다.

  • %p 는 모든 구두점 문자를 나타냅니다.

  • %g 은 공백을 제외한 모든 인쇄 가능한 문자를 나타냅니다.

  • %c 는 모든 제어 문자를 나타냅니다.

  • [set][set] 에있는 모든 문자의 합집합 인 클래스를 나타냅니다.

  • [^set][^set] 의 보수를 나타냅니다.

  • * 욕심 많은 일치 이전 문자 클래스의 0 번 이상 발생

  • + 욕심 많은 일치 이전 문자 클래스의 1 회 이상 발생

  • - 게으른 일치 이전 문자 클래스가 0 회 이상 발생합니다.

  • ? 이전의 문자 클래스가 정확히 0 번 또는 1 번 일치한다.

비고

몇 가지 예를 통해 표기법 (<string literal>):function <string literal> 이 사용됩니다.이 string.function(<string literal>, <string literal>)string.function(<string literal>, <string literal>) 과 동일합니다. 모든 문자열은 __index 필드 집합 string 테이블에.

루아 패턴 매칭

regex를 사용하는 대신, Lua 문자열 라이브러리에는 구문 일치에 사용되는 특수 문자 집합이 있습니다. 둘 다 매우 유사 할 수 있지만 루아 패턴 일치는 더 제한적이며 다른 구문을 사용합니다. 예를 들어, %a 문자 시퀀스는 모든 문자와 일치하지만 대문자 버전은 모든 비 문자 문자를 나타내며 모든 문자 클래스 (패턴으로 항목 세트와 일치 할 수있는 문자 시퀀스)는 아래에 나열됩니다.

문자 클래스 일치하는 섹션
%에이 글자 (AZ, az)
%기음 제어 문자 (\ n, \ t, \ r, ...)
%디 숫자 (0-9)
%엘 소문자 (az)
%피 구두점 문자 (!,?, &, ...)
%에스 공백 문자
%유 대문자
% w 영숫자 (AZ, az, 0-9)
%엑스 16 진수 (\ 3, \ 4, ...)
%지 표현이 0 인 문자
. 모든 문자와 일치합니다.

위에서 언급했듯이, 이러한 클래스의 대문자 버전은 클래스의 보수를 나타냅니다. 예를 들어 %D 는 임의의 비 숫자 문자 시퀀스와 일치합니다.

string.match("f123", "%D")          --> f

문자 클래스 외에도 일부 문자는 패턴과 같은 특수한 기능을 가지고 있습니다.

( ) % . + - * [ ? ^ $

문자 % 는 문자 이스케이프를 나타내며 %? 심문과 일치하고 %% 는 백분율 기호와 일치합니다. % 문자를 다른 영숫자가 아닌 문자와 함께 사용할 수 있으므로 따옴표와 같이 이스케이프해야하는 경우 앞에 \\ 를 사용해야합니다. 그러면 루아 문자열의 문자를 이스케이프 처리합니다.

대괄호 ( [] ) 안에 표시된 문자 세트를 사용하면 여러 클래스와 단일 문자를 결합하여 특수 문자 클래스를 만들 수 있습니다.

local foo = "bar123bar2341"
print(foo:match "[arb]")            --> b

^ :로 시작하여 캐릭터 세트의 보완을 얻을 수 있습니다.

local foo = "bar123bar2341"
print(string.match(foo, "[^bar]"))  --> 1

이 예에서 string.matchb , a 또는 r 이 아닌 첫 번째 항목을 찾습니다.

패턴은 반복 / 선택적 수식어의 도움으로 더욱 유용 할 수 있습니다. lua의 패턴은 다음 네 가지 문자를 제공합니다.

캐릭터 모디파이어
+ 하나 이상의 반복
* 0 회 이상 반복
- 또한 0 번 이상의 반복
? 선택 사항 (0 또는 1 회 발생)

문자 + 는 시퀀스에서 하나 이상의 일치하는 문자를 나타내며 항상 가장 긴 일치 시퀀스를 반환합니다.

local foo = "12345678bar123"
print(foo:match "%d+")  --> 12345678

보시다시피 *+ 와 유사하지만 문자가 전혀 나타나지 않으며 여러 패턴 사이의 선택적 공백을 비교하는 데 주로 사용됩니다.

캐릭터는 - 또한 유사하다 * , 대신 가장 긴 일치 시퀀스를 반환하는, 그것은 짧은 하나와 일치합니다.

수식어 ? 선택 문자와 일치하여 음수와 같이 일치시킬 수 있습니다.

local foo = "-20"
print(foo:match "[+-]?%d+")

루아 패턴 매칭 엔진은 몇 가지 추가적인 패턴 일치 아이템을 제공합니다 :

문자 항목 기술
%n n이 1에서 9 사이의 경우 일치하는 n 번째 캡처 문자열과 일치하는 부분 문자열
%bxy 두 개의 별개 문자 ( xy 의 균형 쌍) 사이의 부분 문자열을 일치시킵니다.
%f[set] 프론티어 패턴 (frontier pattern) : 임의의 위치에서 빈 문자열과 일치하므로 다음 문자
집합에 속하며 이전 문자는 집합에 속하지 않습니다.

string.find (소개)

find 기능

먼저 일반적인 string.find 함수를 살펴 보겠습니다.

함수 string.find (s, substr [, init [, plain]]) 을 찾을 경우 문자열의 시작 및 종료 인덱스를 리턴하고, 그렇지 않으면 전무 인덱스에서 시작 init 가 (1 디폴트)를 제공하는 경우.

("Hello, I am a string"):find "am" --> returns 10 11
-- equivalent to string.find("Hello, I am a string", "am") -- see remarks

패턴 소개

("hello world"):find ".- " -- will match characters until it finds a space
    --> so it will return 1, 6

다음 문자를 제외한 모든 문자는 ^$()%.[]*+-?) 냅니다. 이 문자들 중 어떤 것도 문자 자체 뒤에 % 로 표시 될 수 있습니다.

("137'5 m47ch s0m3 d1g175"):find "m%d%d" -- will match an m followed by 2 digit
    --> this will match m47 and return 7, 9

("stack overflow"):find "[abc]" -- will match an 'a', a 'b' or a 'c'
    --> this will return 3 (the A in stAck)

("stack overflow"):find "[^stack ]"
    -- will match all EXCEPT the letters s, t, a, c and k and the space character
    --> this will match the o in overflow

("hello"):find "o%d?" --> matches o, returns 5, 5
("hello20"):find "o%d?" --> matches o2, returns 5, 6
    -- the ? means the character is optional

("helllllo"):find "el+" --> will match elllll
("heo"):find "el+" --> won't match anything

("helllllo"):find "el*" --> will match elllll
("heo"):find "el*" --> will match e

("helelo"):find "h.+l" -- + will match as much as it gets
    --> this matches "helel"
("helelo"):find "h.-l" -- - will match as few as it can
    --> this wil only match "hel"

("hello"):match "o%d*"
    --> like ?, this matches the "o", because %d is optional
("hello20"):match "o%d*"
    --> unlike ?, it maches as many %d as it gets, "o20"
("hello"):match "o%d"
    --> wouldn't find anything, because + looks for 1 or more characters

`gmatch` 함수

작동 원리

string.gmatch 함수는 입력 문자열과 패턴을 취합니다. 이 패턴은 실제로 되돌아 가야 할 것에 대해 설명합니다. 이 함수는 실제로 반복자 인 함수를 반환합니다. 이 반복자의 결과는 패턴과 일치합니다.

type(("abc"):gmatch ".") --> returns "function"

for char in ("abc"):gmatch "." do
    print char -- this prints:
    --> a
    --> b
    --> c
end

for match in ("#afdde6"):gmatch "%x%x" do
    print("#" .. match) -- prints:
    --> #af
    --> #dd
    --> #e6
end

캡처 소개 :

이것은 일반 함수와 매우 유사하지만 전체 일치 대신 캡처 만 반환합니다.

for key, value in ("foo = bar, bar=foo"):gmatch "(%w+)%s*=%s*(%w+)" do
    print("key: " .. key .. ", value: " .. value)
    --> key: foo, value: bar
    --> key: bar, value: foo
end

gsub 함수

substring을 반환하는 string.sub 함수와 혼동하지 마십시오!

작동 원리

문자열 인수

("hello world"):gsub("o", "0")
    --> returns "hell0 w0rld", 2
    -- the 2 means that 2 substrings have been replaced (the 2 Os)

("hello world, how are you?"):gsub("[^%s]+", "word")
    --> returns "word word, word word word?", 5

("hello world"):gsub("([^%s])([^%s]*)", "%2%1")
    --> returns "elloh orldw", 2

함수 인수

local word = "[^%s]+"

function func(str)
    if str:sub(1,1):lower()=="h" then
        return str
    else
        return "no_h"
    end
end
("hello world"):gsub(word, func)
    --> returns "hello no_h", 2

테이블 인수

local word = "[^%s]+"

sub = {}
sub["hello"] = "g'day"
sub["world"] = "m8"

("hello world"):gsub(word, sub)
    --> returns "g'day m8"

("hello world, how are you?"):gsub(word, sub)
    --> returns "g'day m8, how are you?"
    -- words that are not in the table are simply ignored


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow