Le type de données chaîne est une séquence de caractères, tels que des lettres, des chiffres et des symboles.C'est le type de données pour stocker la plupart des informations basées sur du texte.
Déclarer des chaînes
Pour déclarer une variable de chaîne, mettez des guillemets autour des caractères.Il est plus courant d'utiliser des guillemets doubles ( " ), mais les guillemets simples ( ' ) fonctionnent également.Si vous voulez inclure une citation simple ou double dans votre chaîne, enveloppez votre chaîne autour de l'autre type de citation, ou utilisez une citation échappée.
local string1 = "Hello world!"print(string1) --> Bonjour monde !local string2 = 'Hello "world"!'print(string2) --> Hello "world"!
Pour inclure des quotes uniques et doubles dans une chaîne, ou pour créer des chaînes à plusieurs lignes, déclarez-les en utilisant des parenthèses doubles :
local string1 = [[Helloworld!Hello "world"!Hello 'world'!]]print(string1)--> Bonjour--> monde !--> Bonjour « monde » !--> Hello 'world'!
Si nécessaire, vous pouvez imbriquer plusieurs parenthèses dans une chaîne en utilisant le même nombre d'égales signes à la fois dans le début et la fin de la parenthèse :
local string1 = [=[Hello[[world!]]]=]print(string1)--> Bonjour--> [[world!]]
Combiner les chaînes
Pour combiner des chaînes, concaténer les avec deux points ( .. ).La concaténation des chaînes n'insère pas d'espace entre elles, vous devrez donc inclure de l'espace (s) à la fin/au début d'une chaîne précédente/suivante ou concaténer un espace entre les deux chaînes.
local hello = "Hello"local helloWithSpace = "Hello "local world = "world!"local string1 = hello .. worldlocal string2 = helloWithSpace .. worldlocal string3 = hello .. " " .. worldprint(string1) --> Monde Helloworld !print(string2) --> Bonjour monde !print(string3) --> Hello world!
Notez que la commande print() prend plusieurs arguments et les combine avec des espaces, afin que vous puissiez utiliser , à la place de .. pour produire des espaces dans les sorties print().
local hello = "Hello"local world = "world"local exclamationMark = "!"print(hello .. world .. exclamationMark) --> Monde Helloworld !print(hello, world .. exclamationMark) --> Bonjour monde !print(hello, world, exclamationMark) --> Hello world !
Convertir des chaînes
Pour convertir une chaîne en nombre, utilisez la fonction tonumber(). Si la chaîne n'a pas de représentation numérique, tonumber() renvoie nil.
local numericString = "123"print(tonumber(numericString)) --> 123local alphanumericString = "Hello123"print(tonumber(alphanumericString)) --> nil
Échappez les chaînes
Pour échapper à une déclaration de chaîne double ou simple et inclure presque n'importe quel caractère, mettez un retour arrière ( \ ) devant le caractère.Par exemple :
- Pour insérer une seule citation dans une chaîne de citation unique, utilisez \' .
- Pour insérer une citation double dans une chaîne de citation double, utilisez \" .
local string1 = 'Hello \'world\'!'print(string1) --> Bonjour 'monde' !local string2 = "Hello \"world\"!"print(string2) --> Hello "world"!
Certains caractères suivant des retours arrière produisent des caractères spéciaux plutôt que des caractères échappés :
- Pour insérer une nouvelle ligne, utilisez \n .
- Pour insérer une tab horizontale, utilisez \t .
local string1 = "Hello\nworld!"print(string1)--> Bonjour--> monde !local string2 = "Hello\tworld!"print(string2) --> Hello world!
interpolationde chaîne
Luau prend en charge l'interpolation de chaînes , une fonctionnalité qui vous permet d'insérer des expressions dans des chaînes.Utilisez des tirets arrière ( ` ) pour déclarer une chaîne interpolée, puis ajoutez des expressions à l'intérieur de parenthèses courbes :
local world = "world"local string1 = `Hello {world}!`print(string1) --> Hello world!
Bien que les variables soient l'utilisation la plus courante, vous pouvez utiliser n'importe quelle expression, y compris la mathématique :
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) --> Bonjour monde, 1 fois !print(string2) --> Bonjour monde, 2 fois !print(string3) --> Hello world a third time!
Les règles d'évasion standard s'appliquent aux tirets, aux parenthèses courbes et aux retours arrière :
local string1 = `Hello \`\{world\}\`!`print(string1) --> Hello `{world}`!
Conversion mathématique
Si vous effectuez des opérations mathématiques sur une chaîne, Luau convertit automatiquement la chaîne en un nombre.Si la chaîne n'a pas de représentation numérique, elle lance une erreur.
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
Comparaisons
Les chaînes peuvent être comparées en utilisant les opérateurs <, <=, > et >= qui comparent en ordre lexical en fonction des codes ASCII de chaque caractère dans une chaîne.Cela entraînera des nombres dans les chaînes ne pas être comparés correctement, par exemple, "100" sera inférieur à "20" , puisque les octets "0" et "1" ont des codes ASCII inférieurs à l'octet "2" .
print("Apple" < "apple") --> vraiprint("Banana" < "apple") --> true (B est avant un dans ASCII)print("number100" < "number20") --> true
Référence au modèle de chaîne
Un modèle de chaîne est une combinaison de caractères que vous pouvez utiliser avec , et d'autres fonctions pour trouver un morceau, ou une sous-chaîne, d'une chaîne plus longue.
Correspondances directes
Vous pouvez utiliser des correspondances directes dans une fonction Luau comme string.match() , sauf pour les caractères magiques .Par exemple, ces commandes recherchent le mot Roblox dans une chaîne :
local match1 = string.match("Welcome to Roblox!", "Roblox")local match2 = string.match("Welcome to my awesome game!", "Roblox")print(match1) --> Robloxprint(match2) --> nil
Classes de caractères
Les classes de caractères sont essentielles pour les recherches de chaînes plus avancées.Vous pouvez les utiliser pour rechercher quelque chose qui n'est pas nécessairement spécifique au caractère mais qui s'inscrit dans une catégorie connue (classe), y compris lettres , chiffres , espaces , ponctuation et plus encore.
Le tableau suivant montre les classes de caractères officielles pour les modèles de chaîne Luau :
Classe | Représente | Exemple de correspondance |
---|---|---|
. | Tout caractère | 32kasGJ1%fTlk ?@94 |
%a | Une lettre majuscule ou minuscule | abcdefghijklmnopqrsztuvwxyz |
%l | Une lettre minuscule | abcdefghijklmnopqrstuvwxyz |
%u | Une lettre majuscule | ABCDEFGHIJKLMNOPQRSTUVWXYZ |
%d | N'importe quel chiffre (number) | 0123456789 |
%p | Tout caractère de ponctuation | !@#;,. |
%w | Un caractère alphanumérique (lettre ou un nombre) | abcdefghijklmnopqrsztuvwxyz0123456789 |
%s | Un espace ou un caractère blanc | , \n , et \r |
%c | Un caractère de contrôle spécial | |
%x | Un caractère hexadécimal | 0123456789 ABCDEF |
%z > | Le caractère NULL (\0 ) |
Pour les classes de caractère à une lettre telles que %a et %s, la lettre majuscule correspondante représente l'« opposé » de la classe.Par instance, %p représente un caractère de ponctuation alors que %P représente tous les caractères sauf le ponctuel.
Personnages magiques
Il y a 12 «personnages magiques» qui sont réservés à des fins spéciales dans les modèles :
$ | % | ^ | * | ( | ) |
. | [ | ] | + | - | ? |
Vous pouvez vous échapper et rechercher des caractères magiques en utilisant le symbole %.Par exemple, pour rechercher roblox.com , échappez le symbole . (point) en le précédant d'un % comme dans %. .
-- les correspondances "roblox.com" à "roblox#com" sont interprétées comme "n'importe quel caractère"local match1 = string.match("What is roblox#com?", "roblox.com")print(match1) --> roblox#com-- Échappez-vous de la période avec % afin qu'elle soit interprétée comme un caractère de période littérallocal match2 = string.match("I love roblox.com!", "roblox%.com")print(match2) --> roblox.com
Ancrages
Vous pouvez rechercher un modèle au début ou à la fin d'une chaîne en utilisant les symboles ^ et $.
local start1 = string.match("first second third", "^first") -- Correspond parce que "premier" est au débutprint(start1) --> d'abordlocal start2 = string.match("third second first", "^first") -- Ne correspond pas parce que "premier" n'est pas au débutprint(start2) --> zérolocal end1 = string.match("first second third", "third$") -- Correspond parce que "troisième" est à la terminerprint(end1) --> troisièmelocal end2 = string.match("third second first", "third$") -- Ne correspond pas parce que "troisième" n'est pas à la terminerprint(end2) --> nil
Vous pouvez également utiliser à la fois ^ et $ ensemble pour vous assurer qu'un modèle correspond uniquement à l'ensemble de la chaîne et non à une partie seulement.
-- Utiliser à la fois ^ et $ pour correspondre à travers une chaîne complètelocal match1 = string.match("Roblox", "^Roblox$") -- Correspond parce que "Roblox" est l'ensemble de la chaîne (égalité)print(match1) --> Robloxlocal match2 = string.match("I play Roblox", "^Roblox$") -- Ne correspond pas parce que "Roblox" n'est pas au début ET à la terminerprint(match2) --> zérolocal match3 = string.match("I play Roblox", "Roblox") -- Correspond parce que "Roblox" est contenu dans "J'ai joué à Roblox"print(match3) --> Roblox
Modifieurs de classe
Par lui-même, une classe de caractère ne correspond qu'à un caractère dans une chaîne.Par instance, le modèle suivant ( ) commence à lire la chaîne de gauche à droite, trouve le premier nombre ( ), et s'arrête.
local match = string.match("The Cloud Kingdom has 25 power gems", "%d")print(match) --> 2
Vous pouvez utiliser modificateurs avec n'importe quelle classe de caractère pour contrôler le resultats:
Quantificateur | Signification |
---|---|
+ | Correspondre à 1 ou plus de la classe de caractère précédente |
- | Correspondre à le moins possible de la classe de caractère précédente |
* | Correspondre à 0 ou plus de la classe de caractère précédente |
? | Correspondre à 1 ou moins de la classe de caractère précédente |
%n | Pour n entre 1 et 9, correspond à une sous-chaîne égale à la chaîne capturée n. |
%bxy | La capture équilibrée correspondant à x, y, et tout ce qui se trouve entre (par exemple, %b() correspond à une paire de parenthèses et tout ce qui se trouve entre elles) |
Ajouter un modifieur au même motif ( "%d+" au lieu de "%d" ), produit 25 au lieu de 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
Ensembles de classes
Les ensembles doivent être utilisés lorsqu'une seule classe de caractère ne peut pas faire tout le travail.Par instance, vous pouvez vouloir correspondre à la fois aux lettres minuscules ( ) et aux caractères de ponctuation ( ) en utilisant un seul modèle.
Les ensembles sont définis par des parenthèses [] autour d'eux.Dans l'exemple suivant, remarquez la différence entre l'utilisation d'un ensemble ( "[%l%p]+" ) et pas l'utilisation d'un ensemble ( "%l%p+" ).
local match1 = string.match("Hello!!! I am another string.", "[%l%p]+") -- Définirprint(match1) --> ello!!!local match2 = string.match("Hello!!! I am another string.", "%l%p+") -- Non définiprint(match2) --> o!!!
La première commande (configurer) indique à Luau de trouver à la fois les caractères minuscules et la ponctuation.Avec le quantificateur + ajouté après l'ensemble configurer, il trouve tous ces caractères ( ello!!! ), s'arrêtant lorsqu'il atteint l'espace.
Dans la deuxième commande (non définie), le quantificateur + ne s'applique qu'à la classe %p précédente, donc Luau ne saisit que le premier caractère minuscule ( o ) avant la série de ponctuation ( !!! ).
Comme les Classesde caractères, les ensembles peuvent être des « opposés » d'eux-mêmes.Cela se fait en ajoutant un caractère ^ au début du configurer, directement après l'ouverture [.Par instance, "[%p%s]+" représente à la fois la ponctuation et les espaces, tandis que "[^%p%s]+" représente tous les caractères sauf la ponctuation et les espaces.
Les ensembles supportent également les portées qui vous permettent de trouver une gamme entière de correspondances entre un caractère de départ et un caractère de fin.Il s'agit d'une fonctionnalité avancée qui est détaillée en plus de détail dans le Manuel Lua 5.1.
Captures de chaîne
Les captures de chaîne sont des sous-modèles dans un modèle .Ceux-ci sont encerclés dans des parenthèses () et sont utilisés pour obtenir (capturer) des sous-chaînes correspondantes et les enregistrer dans des variables.Par exemple, le modèle suivant contient deux captures, (%a+) et (%d+) , qui retournent deux sous-chaînes lors d'un correspondreréussi.
local pattern = "(%a+)%s?=%s?(%d+)"local key1, val1 = string.match("TwentyOne = 21", pattern)print(key1, val1) --> TwentyOne 21local key2, val2 = string.match("TwoThousand= 2000", pattern)print(key2, val2) --> Deux mille 2000local key3, val3 = string.match("OneMillion=1000000", pattern)print(key3, val3) --> OneMillion 1000000
Dans le modèle précédent, le quantificateur ? qui suit les deux classes %s est une addition sûre car il rend l'espace à côté du signe = facultatif.Cela signifie que le match réussit si un (ou les deux) espaces manquent autour du signe égal.
Les captures de chaîne peuvent également être imbriquées comme l'exemple suivant :
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--> Le royaume du cloud est paradisiaque--> Royaume du cloud--> Le royaume de la forêt est pacifique--> Forest Kingdom
Cette recherche de modèle fonctionne comme suit :
L'iterator string.gmatch() recherche une correspondance sur l'ensemble du modèle « description » défini par la paire extérieure de parenthèses.Cela s'arrête au premier virgule et capture ce qui suivre:
# | Motif | Capture |
---|---|---|
1 | (Le%s (%a+%sRoyaume)[%w%s]+) | Le royaume du cloud est paradisiaque |
En utilisant sa première capturerréussie, l'iterator recherche ensuite une correspondance sur le modèle « royaume » défini par la paire intérieure de parenthèses.Ce motif hérité capture simplement ce qui suivre:
# | Motif | Capture |
---|---|---|
2 | (%a+%sRoyaume) | Royaume du cloud |
L'iterator se retire ensuite et poursuit la recherche de la chaîne complète, en capturant ce qui suivre:
# | Motif | Capture |
---|---|---|
3 | (Le%s (%a+%sRoyaume)[%w%s]+) | Le royaume de la forêt est paisible |
4 | (%a+%sRoyaume) | Royaume de la forêt |
En plus de tout ce qui précède, il y a un cas spécial avec une capture vide vide ( () ).Si une capture est vide, la position dans la chaîne sera capturée :
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
Ces captures spéciales peuvent être imbriquées comme des captures normales :
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--> Cloud 10--> Forest 42
Les valeurs renvoyées sont inhabituelles en ce qu'elles sont des nombres plutôt que des chaînes :
local match = "This is an example"local pattern = "This is an ()example"local position = string.match(match, pattern)print(typeof(position)) --> number