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 utilisé pour stocker la plupart des informations textuelles.
Déclarer des chaînes
Pour déclarer une variable chaîne, mettez des guillemets autour des caractères. Il est plus courant d'utiliser des guillemets doubles ("), mais des guillemets simples (') fonctionnent également. Si vous souhaitez inclure un guillemet simple ou un guillemet double dans votre chaîne, enfermez votre chaîne dans l'autre type de guillemet, ou utilisez un guillemet échappé.
local string1 = "Bonjour le monde!"print(string1) --> Bonjour le monde!local string2 = 'Bonjour "monde"!'print(string2) --> Bonjour "monde"!
Pour inclure à la fois des guillemets simples et des guillemets doubles dans une chaîne, ou pour créer des chaînes multiligne, déclarez-les à l'aide de doubles crochets :
local string1 = [[Bonjourmonde!Bonjour "monde"!Bonjour 'monde'!]]print(string1)--> Bonjour--> monde!--> Bonjour "monde"!--> Bonjour 'monde'!
Si nécessaire, vous pouvez imbriquer plusieurs crochets à l'intérieur d'une chaîne en utilisant le même nombre de signes égal au début et à la fin du crochet :
local string1 = [=[Bonjour[[monde!]]]=]print(string1)--> Bonjour--> [[monde!]]
Combiner des chaînes
Pour combiner des chaînes, concaténez-les avec deux points (..). La concaténation des chaînes n'insère pas d'espace entre elles, donc vous devrez inclure des espaces à la fin/début d'une chaîne précédente/suivante, ou concaténer un espace entre les deux chaînes.
local hello = "Bonjour"local helloWithSpace = "Bonjour "local world = "monde!"local string1 = hello .. worldlocal string2 = helloWithSpace .. worldlocal string3 = hello .. " " .. worldprint(string1) --> Bonjourmonde!print(string2) --> Bonjour monde!print(string3) --> Bonjour monde!
Notez que la commande print() prend plusieurs arguments et les combine avec des espaces, donc vous pouvez utiliser , au lieu de .. pour générer des espaces dans les sorties de print().
local hello = "Bonjour"local world = "monde"local exclamationMark = "!"print(hello .. world .. exclamationMark) --> Bonjourmonde!print(hello, world .. exclamationMark) --> Bonjour monde!print(hello, world, exclamationMark) --> Bonjour monde !
Convertir des chaînes
Pour convertir une chaîne en un nombre, utilisez la fonction tonumber(). Si la chaîne n'a pas de représentation numérique, tonumber() retourne nil.
local numericString = "123"print(tonumber(numericString)) --> 123local alphanumericString = "Bonjour123"print(tonumber(alphanumericString)) --> nil
Échapper des chaînes
Pour échapper une déclaration de chaîne avec des guillemets doubles ou simples et intégrer presque n'importe quel caractère, mettez un antislash (\) avant le caractère. Par exemple :
- Pour intégrer un guillemet simple dans une chaîne avec des guillemets simples, utilisez \'.
- Pour intégrer un guillemet double dans une chaîne avec des guillemets doubles, utilisez \".
local string1 = 'Bonjour \'monde\'!'print(string1) --> Bonjour 'monde'!local string2 = "Bonjour \"monde\"!"print(string2) --> Bonjour "monde"!
Certains caractères suivant des antislash produisent des caractères spéciaux plutôt que des caractères échappés :
- Pour intégrer un nouveau ligne, utilisez \n.
- Pour intégrer une tabulation horizontale, utilisez \t.
local string1 = "Bonjour\nmonde!"print(string1)--> Bonjour--> monde!local string2 = "Bonjour\tmonde!"print(string2) --> Bonjour monde!
Interpolation de chaînes
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 backticks (`) pour déclarer une chaîne interpolée, puis ajoutez des expressions à l'intérieur des accolades :
local world = "monde"local string1 = `Bonjour {world}!`print(string1) --> Bonjour monde!
Bien que les variables soient l'utilisation la plus courante, vous pouvez utiliser n'importe quelle expression, y compris des opérations mathématiques :
local world = "monde"local number = 1local letters = {"m", "o", "n", "d", "e"}local string1 = `Bonjour {world}, {number} fois!`local string2 = `Bonjour {world}, {number + 1} fois!`local string3 = `Bonjour {table.concat(letters)} une troisième fois!`print(string1) --> Bonjour monde, 1 fois!print(string2) --> Bonjour monde, 2 fois!print(string3) --> Bonjour monde une troisième fois!
Les règles d'échappement standard s'appliquent aux backticks, accolades et antislashs :
local string1 = `Bonjour \`\{world\}\`!`print(string1) --> Bonjour `{world}`!
Conversion mathématique
Si vous effectuez des opérations mathématiques sur une chaîne, Luau convertit automatiquement la chaîne en nombre. Si la chaîne n'a pas de représentation numérique, elle génère une erreur.
print("55" + 10) --> 65print("55" - 10) --> 45print("55" * 10) --> 550print("55" / 10) --> 5.5print("55" % 10) --> 5print("Bonjour" + 10) --> print("Bonjour" + 10):1: tentative d'effectuer une opération arithmétique (addition) sur une chaîne et un nombre
Comparaisons
Les chaînes peuvent être comparées en utilisant les opérateurs <, <=, > et >= qui comparent en utilisant l'ordre lexicographique basé sur les codes ASCII de chaque caractère dans une chaîne. Cela entraînera des comparaisons incorrectes des nombres dans les chaînes, par exemple, "100" sera inférieur à "20", puisque les octets "0" et "1" ont des codes ASCII inférieurs à l'octet "2".
print("Pomme" < "pomme") --> trueprint("Banane" < "pomme") --> true (B vient avant a en ASCII)print("nombre100" < "nombre20") --> true
Référence de motifs de chaînes
Un motif de chaîne est une combinaison de caractères que vous pouvez utiliser avec string.match(), string.gmatch(), et d'autres fonctions pour trouver une partie, ou 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("Bienvenue à Roblox!", "Roblox")local match2 = string.match("Bienvenue dans mon super jeu!", "Roblox")print(match1) --> Robloxprint(match2) --> nil
Classes de caractères
Les classes de caractères sont essentielles pour des recherches de chaînes plus avancées. Vous pouvez les utiliser pour rechercher quelque chose qui n'est pas nécessairement spécifique à un caractère mais qui s'inscrit dans une catégorie connue (classe), incluant lettres, chiffres, espaces, ponctuation, et plus encore.
Le tableau suivant montre les classes de caractères officielles pour les motifs de chaînes Luau :
| Classe | Représente | Exemple de correspondance |
|---|---|---|
| . | Tout caractère | 32kasGJ1%fTlk?@94 |
| %a | Une lettre majuscule ou minuscule | aBcDeFgHiJkLmNoPqRsTuVwXyZ |
| %l | Une lettre minuscule | abcdefghijklmnopqrstuvwxyz |
| %u | Une lettre majuscule | ABCDEFGHIJKLMNOPQRSTUVWXYZ |
| %d | Tout chiffre (nombre) | 0123456789 |
| %p | Tout caractère de ponctuation | !@#;,. |
| %w | Un caractère alphanumérique (soit une lettre ou un nombre) | aBcDeFgHiJkLmNoPqRsTuVwXyZ0123456789 |
| %s | Un espace ou un caractère d'espace vide | , \n, et \r |
| %c | Un caractère de contrôle spécial | |
| %x | Un caractère hexadécimal | 0123456789ABCDEF |
| %z | Le caractère NULL (\0) |
Pour les classes de caractères à lettre unique telles que %a et %s, la lettre majuscule correspondante représente "l'opposé" de la classe. Par exemple, %p représente un caractère de ponctuation tandis que %P représente tous les caractères sauf la ponctuation.
Caractères magiques
Il existe 12 "caractères magiques" qui sont réservés à des fins spéciales dans les motifs :
| $ | % | ^ | * | ( | ) |
| . | [ | ] | + | - | ? |
Vous pouvez é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 %..
-- "roblox.com" correspond à "roblox#com" car le point est interprété comme "tout caractère"local match1 = string.match("Qu'est-ce que roblox#com?", "roblox.com")print(match1) --> roblox#com-- Échappez le point avec % afin qu'il soit interprété comme un caractère littéral (point)local match2 = string.match("J'adore roblox.com!", "roblox%.com")print(match2) --> roblox.com
Ancrages
Vous pouvez rechercher un motif au début ou à la fin d'une chaîne en utilisant les symboles ^ et $.
local start1 = string.match("premier deuxième troisième", "^premier") -- Correspond car "premier" est au débutprint(start1) --> premierlocal start2 = string.match("troisième deuxième premier", "^premier") -- Ne correspond pas car "premier" n'est pas au débutprint(start2) --> nillocal end1 = string.match("premier deuxième troisième", "troisième$") -- Correspond car "troisième" est à la finprint(end1) --> troisièmelocal end2 = string.match("troisième deuxième premier", "troisième$") -- Ne correspond pas car "troisième" n'est pas à la finprint(end2) --> nil
Vous pouvez également utiliser ^ et $ ensemble pour garantir qu'un motif ne correspond qu'à la chaîne complète et pas seulement à une partie de celle-ci.
-- Utilisation de ^ et $ pour correspondre à une chaîne complètelocal match1 = string.match("Roblox", "^Roblox$") -- Correspond car "Roblox" est la chaîne entière (égalité)print(match1) --> Robloxlocal match2 = string.match("Je joue à Roblox", "^Roblox$") -- Ne correspond pas car "Roblox" n'est pas au début ET à la finprint(match2) --> nillocal match3 = string.match("Je joue à Roblox", "Roblox") -- Correspond car "Roblox" est contenu dans "Je joue à Roblox"print(match3) --> Roblox
Modificateurs de classe
En soi, une classe de caractères ne correspond qu'à un caractère dans une chaîne. Par exemple, le motif suivant ("%d") commence à lire la chaîne de gauche à droite, trouve le premier chiffre (2), et s'arrête.
local match = string.match("Le Royaume des Nuages a 25 gemmes de pouvoir", "%d")print(match) --> 2
Vous pouvez utiliser des modificateurs avec n'importe quelle classe de caractères pour contrôler le résultat :
| Quantificateur | Signification |
|---|---|
| + | Correspond à 1 ou plusieurs de la classe de caractères précédente |
| - | Correspond au moins de la classe de caractères précédente possible |
| * | Correspond à 0 ou plusieurs de la classe de caractères précédente |
| ? | Correspond à 1 ou moins de la classe de caractères précédente |
| %n | Pour n entre 1 et 9, correspond à une sous-chaîne égale à la nième chaîne capturée. |
| %bxy | La correspondance de capture équilibrée correspondant à x, y, et tout ce qui se trouve entre eux (par exemple, %b() correspond à une paire de parenthèses et tout ce qui se trouve entre elles) |
Ajouter un modificateur au même motif ("%d+" au lieu de "%d"), produit 25 au lieu de 2 :
local match1 = string.match("Le Royaume des Nuages a 25 gemmes de pouvoir", "%d")print(match1) --> 2local match2 = string.match("Le Royaume des Nuages a 25 gemmes de pouvoir", "%d+")print(match2) --> 25
Ensembles de classes
Les ensembles doivent être utilisés lorsqu'une seule classe de caractères ne peut pas faire tout le travail. Par exemple, vous pourriez vouloir correspondre à la fois à des lettres minuscules (%l) et à des caractères de ponctuation (%p) en utilisant un seul motif.
Les ensembles sont définis par des crochets [] autour d'eux. Dans l'exemple suivant, remarquez la différence entre l'utilisation d'un ensemble ("[%l%p]+") et de ne pas utiliser d'ensemble ("%l%p+").
local match1 = string.match("Bonjour!!! Je suis une autre chaîne.", "[%l%p]+") -- Ensembleprint(match1) --> on!!!local match2 = string.match("Bonjour!!! Je suis une autre chaîne.", "%l%p+") -- Non-ensembleprint(match2) --> o!!!
La première commande (ensemble) indique à Luau de trouver à la fois des caractères minuscules et des signes de ponctuation. Avec le quantificateur + ajouté après l'ensemble entier, il trouve tous ces caractères (on!!!), arrêtant lorsqu'il atteint l'espace.
Dans la seconde commande (non-ensemble), le quantificateur + ne s'applique qu'à la classe %p avant elle, donc Luau ne prend que le premier caractère minuscule (o) avant la série de ponctuation (!!!).
Comme les classes de caractères, les ensembles peuvent être des "opposés" d'eux-mêmes. Cela se fait en ajoutant un caractère ^ au début de l'ensemble, directement après l'ouverture [ . Par exemple, "[%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 prennent également en charge les plages qui vous permettent de trouver toute une plage de correspondances entre un caractère de départ et un caractère de fin. C'est une fonctionnalité avancée qui est décrite plus en détail dans le Manuel Lua 5.1.
Captures de chaînes
Les captures de chaînes sont des sous-pantalons dans un motif. Ceux-ci sont enfermés dans des parenthèses () et sont utilisés pour obtenir (capturer) des sous-chaînes correspondantes et les sauvegarder dans des variables. Par exemple, le motif suivant contient deux captures, (%a+) et (%d+), qui retournent deux sous-chaînes lors d'une correspondance réussie.
local pattern = "(%a+)%s?=%s?(%d+)"local key1, val1 = string.match("VingtEtUn = 21", pattern)print(key1, val1) --> VingtEtUn 21local key2, val2 = string.match("DeuxMille= 2000", pattern)print(key2, val2) --> DeuxMille 2000local key3, val3 = string.match("UnMillion=1000000", pattern)print(key3, val3) --> UnMillion 1000000
Le quantificateur ? qui suit les deux classes %s est un ajout sécuritaire car il rend l'espace de chaque côté du signe = optionnel. Cela signifie que la correspondance réussit si un (ou les deux) espaces sont manquants autour du signe égal.
Dans la fonction string.gsub(), vous pouvez inclure des groupes de capture dans la chaîne de remplacement en utilisant %1, %2, %3, etc., jusqu'à %9. Même si Luau prend en charge jusqu'à 32 groupes de capture avant de lancer une erreur, vous ne pouvez référencer que les neuf premiers avec cette syntaxe :
local str = "amour2jouer Roblox"local pattern = "(%w+)(%d+)(%w+)%s+(%w+)"local replacement = "Je %1 %2 %3 %4!"local result = string.gsub(str, pattern, replacement)print(result) --> Je amour 2 jouer Roblox!
Vous pouvez également imbriquer des captures de chaînes :
local lieux = "Le Royaume des Nuages est céleste, Le Royaume de la Forêt est paisible"local pattern = "(Le%s(%a+%sRoyaume)[%w%s]+)"for description, royaume in string.gmatch(lieux, pattern) doprint(description)print(royaume)end--> Le Royaume des Nuages est céleste--> Royaume des Nuages--> Le Royaume de la Forêt est paisible--> Royaume de la Forêt
Cette recherche de motif fonctionne comme suit :
L'itérateur string.gmatch() recherche une correspondance sur l'ensemble du motif "description" défini par la paire extérieure de parenthèses. Cela s'arrête à la première virgule et capture ce qui suit :
| # | Motif | Capture |
|---|---|---|
| 1 | (Le%s(%a+%sRoyaume)[%w%s]+) | Le Royaume des Nuages est céleste |
À l'aide de sa première capture réussie, l'itérateur recherche ensuite une correspondance sur le motif "royaume" défini par la paire intérieure de parenthèses. Ce motif imbriqué capture simplement ce qui suit :
| # | Motif | Capture |
|---|---|---|
| 2 | (%a+%sRoyaume) | Royaume des Nuages |
L'itérateur sort ensuite et continue à rechercher dans la chaîne entière, capturant ce qui suit :
| # | 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 existe un cas spécial avec une capture vide (()). Si une capture est vide, alors la position dans la chaîne sera capturée :
local match1 = "Où la capture se produit-elle ? Qui sait !"local match2 = "Cette chaîne est plus longue que la première. Où la capture se produit-elle ? Qui sait ?!"local pattern = "()Où la capture se produit%? Qui sait!()"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 également être imbriquées comme des captures normales :
local lieux = "Le Royaume des Nuages est céleste, Le Royaume de la Forêt est paisible."local pattern = "Le (%a+()) Royaume est %a+"for royaume, position in string.gmatch(lieux, pattern) doprint(royaume, position)end--> des Nuages 10--> de la Forêt 42
Les valeurs retournées sont inhabituelles en ce sens qu'elles sont des nombres plutôt que des chaînes :
local match = "Ceci est un exemple"local pattern = "Ceci est un ()exemple"local position = string.match(match, pattern)print(typeof(position)) --> number