문자열 데이터 유형은 문자, 숫자 및 기호와 같은 시퀀스의 문자입니다.대부분의 텍스트 기반 정보를 저장하는 데이터 유형입니다.
문자열 선언
문자열 변수를 선언하려면 문자 주위에 따옴표를 넣으십시오.더블 쿼티 (") 를 사용하는 것이 더 일반적이지만, 싱글 쿼티 (') 도 작동합니다.문자열에 단일 또는 이중 따옴표를 포함하려면 다른 종류의 따옴표로 문자열을 감싼 또는 이스케이프된 따옴표를 사용하십시오.
local string1 = "Hello world!"print(string1) --> 안녕, 세상!local string2 = 'Hello "world"!'print(string2) --> Hello "world"!
문자열에 단일 및 더블 따옴표를 모두 포함하거나 여러 줄 문자열을 생성하려면 더블 괄호를 사용하여 선언하십시오.
local string1 = [[Helloworld!Hello "world"!Hello 'world'!]]print(string1)--> 헬로--> 세계!--> 안녕 "세계"!--> Hello 'world'!
필요한 경우 시작 및 끝 괄호에서 동일한 수의 똑같은 기호를 사용하여 문자열 내에 여러 괄호를 중첩할 수 있습니다:
local string1 = [=[Hello[[world!]]]=]print(string1)--> 헬로--> [[world!]]
문자열 결합
문자열을 결합하려면 연결하여 두 점으로 나누십시오(..).문자열 연결은 문자열 사이에 공백을 삽입하지 않으므로 이전/후속 문자열의 끝이나 시작에 공백(들)을 포함해야 하거나 두 문자열 사이에 공백을 연결해야 합니다.
local hello = "Hello"local helloWithSpace = "Hello "local world = "world!"local string1 = hello .. worldlocal string2 = helloWithSpace .. worldlocal string3 = hello .. " " .. worldprint(string1) --> 헬로월드!print(string2) --> 안녕, 세상!print(string3) --> Hello world!
명령은 여러 인수를 사용하고 공백으로 결합하여 공간을 생성하므로 출력의 공간을 생성하기 위해 대신 를 사용할 수 있습니다.
local hello = "Hello"local world = "world"local exclamationMark = "!"print(hello .. world .. exclamationMark) --> 헬로월드!print(hello, world .. exclamationMark) --> 안녕, 세상!print(hello, world, exclamationMark) --> Hello world !
문자열 변환
문자열을 숫자로 변환하려면 tonumber() 함수를 사용하십시오. 문자열에 숫자 표현이 없는 경우 tonumber() 는 nil 을 반환합니다.
local numericString = "123"print(tonumber(numericString)) --> 123local alphanumericString = "Hello123"print(tonumber(alphanumericString)) --> nil
문자열 탈출
더블 또는 싱글 따옴표 문 선언을 피하고 거의 모든 문자를 포함하려면 문자 앞에 백슬래시(\)를 넣으십시오.예를 들어:
- 단일 인용구를 단일 인용구 문자열에 포함하려면 \'를 사용하십시오.
- 큰따옴표를 큰따옴표 문자열에 포함하려면 \"를 사용하십시오.
local string1 = 'Hello \'world\'!'print(string1) --> 안녕 '세계'!local string2 = "Hello \"world\"!"print(string2) --> Hello "world"!
백슬래시 뒤에 나오는 특정 문자는 이스케이프된 문자가 아닌 특수 문자를 생성합니다:
- 새 줄을 포함하려면 \n를 사용하십시오.
- 가로 탭을 포함하려면 \t를 사용하십시오.
local string1 = "Hello\nworld!"print(string1)--> 헬로--> 세계!local string2 = "Hello\tworld!"print(string2) --> Hello world!
문자열 중간 계산
Luau는 문자열 간섭 을 지원하며, 문자열에 식을 삽입할 수 있는 기능입니다.백틱( ` )을 사용하여 간섭된 문자열을 선언한 다음 굵은 괄호 내에 식을 추가하십시오:
local world = "world"local string1 = `Hello {world}!`print(string1) --> Hello world!
변수가 가장 일반적인 사용이지만, 수학을 포함한 모든 식을 사용할 수 있습니다:
local world = "world"local number = 1local letters = {"w", "o", "r", "l", "d"}local string1 = `Hello {world}, {number} time!`local string2 = `Hello {world}, {number + 1} times!`local string3 = `Hello {table.concat(letters)} a third time!`print(string1) --> 안녕 세상, 1회!print(string2) --> 세상에 안녕, 2번!print(string3) --> Hello world a third time!
표준 이스케이프 규칙은 백틱, 굵은 괄호 및 백슬래시에 적용됩니다:
local string1 = `Hello \`\{world\}\`!`print(string1) --> Hello `{world}`!
수학 변환
문자열에 수학 작업을 수행하면 Luau가 자동으로 문자열을 숫자로 변환합니다.문자열에 숫자 표현이 없으면 오류가 발생합니다.
print("55" + 10) --> 65print("55" - 10) --> 45print("55" * 10) --> 550print("55" / 10) --> 5.5print("55" % 10) --> 5print("Hello" + 10) --> print("Hello" + 10):1: attempt to perform arithmetic (add) on string and number
비교
문자열은 ASCII 코드에 따라 문자열의 각 문자의 순서에 따라 비교하는 <, <=, > 및 >= 연산자를 사용하여 비교할 수 있습니다.Strings can be compared using the , , and operators which compare using lexicographical order based on the ASCII codes of each character in a string.이로 인해 문자열의 숫자가 올바르게 비교되지 않아 예를 들어 "100" 는 "20" 보다 작을 것이고, 바이트 "0" 및 "1" 는 바이트 "2" 보다 ASCII 코드가 낮습니다.
print("Apple" < "apple") --> 참print("Banana" < "apple") --> true (B는 ASCII에서 인 앞에 있음)print("number100" < "number20") --> true
문자열 패턴 참조
A 문자열 패턴 은 긴 문자열의 조각이나 부분을 찾기 위해 string.match() , string.gmatch() 및 기타 함수를 사용할 수 있는 문자의 조합입니다.
직접 일치
마법 문자를 제외하고 Luau 함수에서 직접 일치를 사용할 수 있습니다. string.match() , 마법 문자 .예를 들어, 이 명령은 문자열 내에서 단어 Roblox 을 찾습니다:
local match1 = string.match("Welcome to Roblox!", "Roblox")local match2 = string.match("Welcome to my awesome game!", "Roblox")print(match1) --> Robloxprint(match2) --> nil
문자 클래스
캐릭터 클래스는 더 고급의 문자열 검색에 필수적입니다.문자 특정이 아니지만 알려진 범주(클래스) 내에 있는 무언가를 검색하기 위해 사용할 수 있습니다( 문자 , 숫자 , 공백 , 구두점 포함).
다음 표에서는 Luau 문자열 패턴에 대한 공식 캐릭터 클래스를 보여줍니다:
클래스 | 나타냅니다 | 예시 일치 |
---|---|---|
. | 모든 문자 | 32kasGJ1%fTlk?@94 |
%a | 대/소문자 문자 | abcdefghijklmnopqrsztuvwxyz |
%l | 소문자 문자 A lowercase letter | abcdefghijklmnopqrstuvwxyz |
%u | 대문자 문자 | ABCDEFGHIJKLMNOPQRSTUVWXYZ |
%d | 모든 숫자(번호) | 0123456789 |
%p | 어떤 단락 기호 문자든 | !@#;,. |
%w | 알파벳 숫자 문자(문자 또는 숫자 또는) | abcdefghijklmnopqrsztuvwxyz0123456789 |
%s | 공백 또는 공백 문자 | , \n , 그리고 \r |
%c | 특수 제어 문자 | |
%x | 16진수 문자 | 0123456789abcdef |
%z | NULL 문자(\0) |
%a 및 %s와 같은 단일 문자 클래스의 경우 해당 대/소문자는 클래스의 "반대"를 나타냅니다.예를 인스턴스, %p 는 구분 기호 문자를 나타내고, %P 는 구분 기호를 제외한 모든 문자를 나타냅니다.
마법 문자
패턴에서 특수 목적으로 예약된 12개의 "마법 문자"가 있습니다:
$ | % | ^ | * | ( | ) |
. | [ | ] | + | - | ? |
% 기호를 사용하여 마법 문자를 탈출시키고 검색할 수 있습니다.예를 들어, roblox.com 을 검색하려면 . (마침표) 기호를 사용하여 앞에 % (마침표) 기호를 추가하여 %. 에서와 같이 탈출합니다.
-- 기간이 "모든 문자"로 해석되기 때문에 "roblox.com"이 "roblox#com"과 일치합니다local match1 = string.match("What is roblox#com?", "roblox.com")print(match1) --> roblox#com-- %로 기간을 탈출하여 리터럴 기간 문자로 해석되도록 합니다local match2 = string.match("I love roblox.com!", "roblox%.com")print(match2) --> roblox.com
앵커
^ 및 $ 기호를 사용하여 문자열의 시작이나 끝에서 패턴을 검색할 수 있습니다.
local start1 = string.match("first second third", "^first") -- 처음에 "첫 번째"가 있기 때문에 일치print(start1) --> 먼저local start2 = string.match("third second first", "^first") -- 처음에 "첫 번째"가 없기 때문에 일치하지 않음print(start2) --> 무효local end1 = string.match("first second third", "third$") -- 앞에 "세 번째"가 있기 때문에 일치합니다print(end1) --> 세 번째local end2 = string.match("third second first", "third$") -- 종료"세 번째"가 없어서 일치하지 않음print(end2) --> nil
패턴이 전체 문자열만 일치하고 일부만 아닌지 확인하기 위해 ^와 $를 함께 사용할 수도 있습니다.
-- 전체 문자열에서 일치하도록 ^와 $를 모두 사용local match1 = string.match("Roblox", "^Roblox$") -- 전체 문자열인 "Roblox"이기 때문에 일치(평등)print(match1) --> Robloxlocal match2 = string.match("I play Roblox", "^Roblox$") -- 앞과 뒤에 "Roblox"가 없기 때문에 일치하지 종료print(match2) --> 무효local match3 = string.match("I play Roblox", "Roblox") -- Roblox가 "나는 Roblox를 플레이한다" 내에 포함되어 있기 때문에 일치합니다print(match3) --> Roblox
클래스 修正자
자체적으로 캐릭터 클래스는 문자열에서 하나의 문자만 일치합니다.예를 인스턴스, 다음 패턴( "%d" )은 왼쪽에서 오른쪽으로 문자열을 읽기 시작하고, 첫 번째 숫자( 2 )를 찾아 중지합니다.
local match = string.match("The Cloud Kingdom has 25 power gems", "%d")print(match) --> 2
모든 문자 클래스로 모디파이어를 사용하여 결과를 제어할 수 있습니다:
정량화기 | 의미 |
---|---|
+ | 이전 문자 클래스 1개 이상과 일치 |
- | 이전 문자 클래스의 가능한 한 적은 부분을 일치시키기 |
* | 이전 문자 클래스 0개 이상 일치 |
? | 이전 문자 클래스 1개 이하와 일치 |
%n | For n between 1 and 9, matches a substring equal to the nth captured 문자열. |
%bxy | 균형 잡힌 캡처가 일치하는 x, y, 그리고 사이에 있는 모든 것(예를 들어, %b()는 괄호 쌍과 그 사이의 모든 것을 일치시킵니다) |
동일한 패턴에 모디파이어를 추가("%d+" 대신 "%d" )하여 출력 25 대신 2 :
local match1 = string.match("The Cloud Kingdom has 25 power gems", "%d")print(match1) --> 2local match2 = string.match("The Cloud Kingdom has 25 power gems", "%d+")print(match2) --> 25
클래스 세트
세트 는 단일 문자 클래스가 전체 작업을 수행할 수 없을 때 사용해야 합니다.예를 인스턴스, 작은 문자( )와 마침표 기호( )를 모두 단일 패턴으로 일치시키고 싶을 수 있습니다.
집합은 괄호 [] 주위에 정의됩니다.다음 예제에서는 집합( )을 사용하고 집합( )을 사용하지 않는 차이를 알아보세요.
local match1 = string.match("Hello!!! I am another string.", "[%l%p]+") -- 설정print(match1) --> 안녕!!!local match2 = string.match("Hello!!! I am another string.", "%l%p+") -- 설정되지 않음print(match2) --> o!!!
첫 번째 명령(설정)은 Luau에게 소문자 및 구두점을 모두 찾도록 지시합니다.전체 집합 이후에 추가된 양자 계산기로 인해 해당 문자의 전체 가 찾아지며, 공백에 도달하면 중지됩니다.
두 번째 명령(설정되지 않음)에서 + 계산기는 앞의 %p 클래스에만 적용되므로 Luau는 마침표 시리즈(!!!) 전에 첫 번째 소문자 문자(o)만 잡습니다.
캐릭터 클래스와 마찬가지로 세트는 자체의 "반대"일 수 있습니다.이는 설정시작에 ^ 문자를 추가하여 열기 [ 바로 후에 수행됩니다.예를 인스턴스, 는 구분 기호와 공백을 모두 나타내며, 는 구분 기호와 공백을 제외한 모든 문자를 나타냅니다.
세트는 또한 범위 를 지원하며, 시작 및 끝 문자 사이의 전체 범위의 일치 항목을 찾을 수 있습니다.이는 루아 5.1 매뉴얼에 자세히 설명된 고급 기능입니다.
문자열 캡처
문자열 은 패턴 내의 하위 패턴입니다.괄호로 묶여 있으며 일치하는 부분 문자열을 가져와 변수에 저장하는 데 사용됩니다. These are enclosed in parentheses () and are used to get (capture) matching substrings and save them to variables.예를 들어 다음 패턴에는 두 개의 캡처, (%a+) 및 (%d+) , 성공적인 일치에 따라 두 개의 부분 문자열을 반환하는 것이 포함되어 있습니다.
local pattern = "(%a+)%s?=%s?(%d+)"local key1, val1 = string.match("TwentyOne = 21", pattern)print(key1, val1) --> 트웬티원 21local key2, val2 = string.match("TwoThousand= 2000", pattern)print(key2, val2) --> 2000개의 2000local key3, val3 = string.match("OneMillion=1000000", pattern)print(key3, val3) --> OneMillion 1000000
이전 패턴에서 두 클래스 모두를 따르는 양자는 공백을 표지 양쪽에 선택적으로 만들기 때문에 안전한 추가입니다.즉, 평등 기호 주위에 하나 이상의 공백이 누락되면 일치가 성공합니다.
문자열 캡처도 다음 예와 같이 중첩될 수 있습니다 :
local places = "The Cloud Kingdom is heavenly, The Forest Kingdom is peaceful"local pattern = "(The%s(%a+%sKingdom)[%w%s]+)"for description, kingdom in string.gmatch(places, pattern) doprint(description)print(kingdom)end--> 클라우드 왕국은 천상입니다--> 클라우드 왕국--> 숲 왕국은 평화롭습니다--> Forest Kingdom
이 패턴 검색은 다음과 같이 작동합니다:
string.gmatch() 반복기는 부모 괄호의 외부 패턴으로 정의된 전체 "설명" 패턴에서 일치하는 항목을 찾습니다.이는 첫 번째 쉼표에서 중지되고 팔로잉캡처합니다:
# | 패턴 | 캡처 |
---|---|---|
1 | (The%s(%a+%sKingdom)[%w%s]+) | 클라우드 왕국은 천상입니다 |
성공적인 첫 번째 캡처를 사용하여 반복기는 부모 괄호의 내부 패턴으로 정의된 "왕국" 패턴에서 일치하는 항목을 찾습니다.이 중첩 패턴은 단순히 팔로잉캡처합니다:
# | 패턴 | 캡처 |
---|---|---|
2 | (%a+%s왕국) | 클라우드 왕국 |
그런 다음 반복기는 물러서서 전체 문자열을 계속 검색하여 팔로잉캡처합니다:
# | 패턴 | 캡처 |
---|---|---|
3 | (The%s(%a+%sKingdom)[%w%s]+) | 숲 왕국은 평화롭습니다 |
4 | (%a+%s왕국) | 숲 왕국 |
위의 모든 것 외에도, 비어있는 캡처 ( )가 있는 특별한 경우가 있습니다.캡처가 비어 있으면 문자열의 위치가 캡처됩니다:
local match1 = "Where does the capture happen? Who knows!"local match2 = "This string is longer than the first one. Where does the capture happen? Who knows?!"local pattern = "()Where does the capture happen%? Who knows!()"local start1, finish1 = string.match(match1, pattern)print(start1, finish1) --> 1 42local start2, finish2 = string.match(match2, pattern)print(start2, finish2) --> 43 84
이러한 특별 캡처는 일반 캡처와 마찬가지로 중첩될 수 있습니다:
local places = "The Cloud Kingdom is heavenly, The Forest Kingdom is peaceful."local pattern = "The (%a+()) Kingdom is %a+"for kingdom, position in string.gmatch(places, pattern) doprint(kingdom, position)end--> 클라우드 10--> Forest 42
반환된 값은 문자열이 아닌 숫자 이기 때문에 특이합니다:
local match = "This is an example"local pattern = "This is an ()example"local position = string.match(match, pattern)print(typeof(position)) --> number