Chaînes de caractères Lua

Une chaîne est une séquence de caractères composée de chiffres, de lettres et de traits de soulignement.

En Lua, les chaînes sont un type de données de base utilisé pour stocker des données textuelles.

Les chaînes en Lua peuvent contenir n'importe quel caractère, y compris des lettres, des chiffres, des symboles, des espaces et d'autres caractères spéciaux.

En Lua, les chaînes peuvent être exprimées selon les trois manières suivantes :

  • Une séquence de caractères entre guillemets simples.

    local str1 = 'This is a string.'
    local str2 = "This is also a string."
  • Une séquence de caractères entre guillemets doubles.

    local str = "Hello, "
    str = str .. "World!"  -- 创建一个新的字符串并将其赋值给str
    print(str)  -- 输出 "Hello, World!"
  • [[et]]Une séquence de caractères entre [[ et ]].

    local multilineString = [[
    This is a multiline string.
    It can contain multiple lines of text.
    No need for escape characters.
    ]]
    
    print(multilineString)

Voici des exemples de chaînes utilisant les trois manières ci-dessus :

Exemple

string1 = "Lua"
print("\"La chaîne 1 est\"",string1)
string2 = 'example.com'
print("La chaîne 2 est",string2)

string3 = [[Tutoriel Lua]]
print("La chaîne 3 est",string3)

La sortie de l'exécution du code ci-dessus est :

"字符串 1 是"    Lua
字符串 2 是    example.com
字符串 3 是    "Lua 教程"

Calcul de la longueur d'une chaîne

En Lua, pour calculer la longueur d'une chaîne (c'est-à-dire le nombre de caractères dans la chaîne), vous pouvez utiliserstring.lenfonction ouutf8.lenfonction, et pour les chaînes contenant du chinois, utilisez généralementutf8.len,string.lenLa fonction est utilisée pour calculer la longueur des chaînes contenant uniquement des caractères ASCII.

Exemple

local myString = "Bonjour, EXEMPLE!"

-- Calculer la longueur de la chaîne (nombre de caractères)
local length = string.len(myString)

print(length) -- Affiche 14

Dans l'exemple ci-dessus, la chaîne myString ne contient que des caractères ASCII, donc la fonctionstring.lenpeut renvoyer précisément la longueur de la chaîne.

Pour les chaînes contenant des caractères chinois, utilisez la fonctionutf8.len:

Exemple

local myString = "Hello, world!"

-- Calculer la longueur de la chaîne (nombre de caractères)
local length1 = utf8.len(myString)
print(length1) -- Sortie 10

-- La fonction string.len produira des résultats inexacts
local length2 = string.len(myString)
print(length2) -- Sortie 14

Le résultat de sortie est:

10
14

Les caractères d'échappement sont utilisés pour représenter des caractères qui ne peuvent pas être affichés directement, tels que la touche retour arrière, le retour chariot, etc. Par exemple, pour inclure des guillemets doubles dans une chaîne, vous pouvez utiliser\。

Tous les caractères d'échappement et leurs significations correspondantes :

Caractère d'échappement
Signification
Valeur ASCII (décimale)
\a
Sonnerie (BEL)
007
\b
Retour arrière (BS), déplace la position actuelle vers la colonne précédente
008
\f
Saut de page (FF), déplace la position actuelle au début de la page suivante
012
\n
Saut de ligne (LF), déplace la position actuelle au début de la ligne suivante
010
\r
Retour chariot (CR), déplace la position actuelle au début de la ligne actuelle
013
\t
Tabulation horizontale (HT) (passe à la position TAB suivante)
009
\v
Tabulation verticale (VT)
011
\\
Représente un caractère barre oblique inverse '\\'
092
\'
Représente un caractère guillemet simple (apostrophe)
039
\"
Représente un caractère guillemet double
034
\0
Caractère nul (NULL)
000
\ddd
Tout caractère représenté par un nombre octal de 1 à 3 chiffres
Octal à trois chiffres
\xhh
Tout caractère représenté par un nombre hexadécimal de 1 à 2 chiffres
Hexadécimal à deux chiffres

Opérations sur les chaînes

Lua fournit de nombreuses méthodes pour prendre en charge les opérations sur les chaînes :

NuméroMéthode et objectif
1string.upper(argument):
Convertit toute la chaîne en lettres majuscules.
2string.lower(argument):
Convertit toute la chaîne en lettres minuscules.
3string.gsub(mainString,findString,replaceString,num)

Remplacer dans une chaîne.

mainString est la chaîne à traiter, findString est le caractère à remplacer, replaceString est le caractère de remplacement, num est le nombre de remplacements (peut être ignoré, alors tous sont remplacés), par exemple :
> string.gsub("aaaa","a","z",3);
zzza    3
4string.find (str, substr, [init, [plain]])

Dans une chaîne cible spécifiée str, recherchez le contenu spécifié substr. Si une sous-chaîne correspondante est trouvée, les indices de début et de fin de la sous-chaîne sont renvoyés ; si elle n'existe pas, nil est renvoyé.

initSpécifie la position de départ de la recherche, par défaut 1. Il peut être un nombre négatif, indiquant le nombre de caractères comptés à partir de la fin.

plainIndique s'il faut utiliser le mode simple, par défaut false. true effectue uniquement une opération de recherche de sous-chaîne simple, false signifie utiliser la correspondance de motif d'expression régulière.

L'exemple suivant trouve les positions d'index de début et de fin de la chaîne "Lua" :

> string.find("Hello Lua user", "Lua", 1) 
7    9
5string.reverse(arg)
Inversion de chaîne
> string.reverse("Lua")
auL
6string.format(...)
Renvoie une chaîne formatée similaire à printf
> string.format("the value is:%d",4)
the value is:4
7string.char(arg) et string.byte(arg[,int])
char convertit les nombres entiers en caractères et les concatène, byte convertit les caractères en valeurs entières (vous pouvez spécifier un caractère particulier, par défaut le premier caractère).
> string.char(97,98,99,100)
abcd
> string.byte("ABCD",4)
68
> string.byte("ABCD")
65
>
8string.len(arg)
Calcule la longueur d'une chaîne.
string.len("abc")
3
9string.rep(string, n)
Renvoie n copies de la chaîne
> string.rep("abcd",2)
abcdabcd
10..
Concatène deux chaînes
> print("www.example.".."com")
www.example.com
11string.gmatch(str, pattern)
Renvoie une fonction itérateur. Chaque fois que cette fonction est appelée, elle renvoie la sous-chaîne suivante trouvée dans la chaîne str qui correspond à la description du motif. Si la chaîne décrite par le paramètre pattern n'est pas trouvée, la fonction itérateur renvoie nil.
> for word in string.gmatch("Hello Lua user", "%a+") do print(word) end
Hello
Lua
user
12string.match(str, pattern, init)
string.match() ne recherche que la première correspondance dans la chaîne source str. Le paramètre init est facultatif et spécifie le point de départ de la recherche, avec 1 comme valeur par défaut.
En cas de correspondance réussie, la fonction renvoie tous les résultats de capture dans l'expression correspondante ; si aucun marqueur de capture n'est défini, elle renvoie toute la chaîne correspondante. En l'absence de correspondance réussie, elle renvoie nil.
> = string.match("I have 2 questions for you.", "%d+ %a+")
2 questions

> = string.format("%d, %q", string.match("I have 2 questions for you.", "(%d+) (%a+)"))
2, "questions"

Sous-chaîne de chaîne

L'extraction de chaîne utilise la méthode sub().

string.sub() sert à extraire une sous-chaîne. Son prototype est :

string.sub(s, i [, j])

Description du paramètre :

  • s : la chaîne à extraire.
  • i : la position de départ pour l'extraction.
  • j : la position de fin pour l'extraction, par défaut -1, le dernier caractère.

Exemple


-- Chaîne
local sourcestr = "prefix--examplegoogletaobao--suffix"
print("\nChaîne originale ", string.format("%q", sourcestr))

-- Extraire la partie, de la 4e à la 15e
local first_sub = string.sub(sourcestr, 4, 15)
print("\nPremière extraction ", string.format("%q", first_sub))

-- Prendre le préfixe de la chaîne, du 1er au 8e
local second_sub = string.sub(sourcestr, 1, 8)
print("\nDeuxième extraction ", string.format("%q", second_sub))

-- Extraire les 10 derniers caractères
local third_sub = string.sub(sourcestr, -10)
print("\nTroisième extraction ", string.format("%q", third_sub))

-- Index hors limites, afficher la chaîne d'origine
local fourth_sub = string.sub(sourcestr, -100)
print("\nQuatrième extraction ", string.format("%q", fourth_sub))

La sortie de l'exécution du code ci-dessus est :

原始字符串    "prefix--examplegoogletaobao--suffix"

第一次截取    "fix--exampleg"

第二次截取    "prefix--"

第三次截取    "ao--suffix"

第四次截取    "prefix--examplegoogletaobao--suffix"

Conversion de casse des chaînes

L'exemple suivant montre comment convertir la casse des chaînes :

Exemple

string1 = "Lua";
print(string.upper(string1))
print(string.lower(string1))

La sortie de l'exécution du code ci-dessus est :

LUA
lua

Recherche et inversion de chaînes

L'exemple suivant montre comment effectuer des opérations de recherche et d'inversion sur des chaînes :

Exemple

string = "Tutoriel Lua"
-- Rechercher une chaîne
print(string.find(string,"Tutoriel"))
reversedString = string.reverse(string)
print("La nouvelle chaîne est",reversedString)

La sortie de l'exécution du code ci-dessus est :

5    12
新字符串为    lairotuT auL

Formatage des chaînes

Lua fournitstring.format()une fonction pour générer des chaînes avec un format spécifique. Le premier paramètre de la fonction est le format, suivi de diverses données correspondant à chaque code du format.

En raison de l'existence de la chaîne de format, la lisibilité des longues chaînes résultantes est grandement améliorée. Le format de cette fonction est très similaire à printf() en C.

L'exemple suivant montre comment effectuer des opérations de formatage sur des chaînes :

La chaîne de format peut contenir les codes d'échappement suivants :

  • %c - accepte un nombre et le convertit en caractère correspondant dans la table ASCII
  • %d, %i - acceptent un nombre et le convertissent au format d'entier signé
  • %o - accepte un nombre et le convertit en format octal
  • %u - accepte un nombre et le convertit en format entier non signé
  • %x - accepte un nombre et le convertit en format hexadécimal, en utilisant des lettres minuscules
  • %X - accepte un nombre et le convertit en format hexadécimal, en utilisant des lettres majuscules
  • %e - accepte un nombre et le convertit en notation scientifique, en utilisant un e minuscule
  • %E - accepte un nombre et le convertit en notation scientifique, en utilisant un E majuscule
  • %f - accepte un nombre et le convertit en format à virgule flottante
  • %g(%G) - accepte un nombre et le convertit au format le plus court entre %e (%E, correspondant à %G) et %f
  • %q - accepte une chaîne et la convertit en un format pouvant être lu en toute sécurité par le compilateur Lua
  • %s - Accepte une chaîne et la formate selon les paramètres donnés.

Pour affiner davantage le format, des paramètres peuvent être ajoutés après le signe %. Les paramètres sont lus dans l'ordre suivant :

  • (1) Signe : Un signe + indique que l'échappement numérique suivant fera afficher un signe positif aux nombres positifs. Par défaut, seuls les nombres négatifs affichent un signe.
  • (2) Caractère de remplissage : un 0, utilisé pour le remplissage lorsqu'une largeur de chaîne est spécifiée ensuite. S'il n'est pas renseigné, le caractère de remplissage par défaut est un espace.
  • (3) Indicateur d'alignement : lorsqu'une largeur de chaîne est spécifiée, l'alignement par défaut est à droite ; l'ajout d'un signe - le fait passer à un alignement à gauche.
  • (4) Valeur de largeur
  • (5) Nombre de décimales / troncature de chaîne : la partie fractionnaire n ajoutée après la valeur de largeur. Si elle est suivie de f (échappement de nombre à virgule flottante, par ex. %6.3f), elle définit le nombre flottant pour ne conserver que n décimales ; si elle est suivie de s (échappement de chaîne, par ex. %5.3s), elle définit la chaîne pour n'afficher que les n premiers caractères.

Exemple

string1 = "Lua"
string2 = "Tutoriel"
number1 = 10
number2 = 20
-- Formatage de base des chaînes
print(string.format("Formatage de base %s %s",string1,string2))
-- Formatage de date
date = 2; month = 1; year = 2014
print(string.format("Formatage de date %02d/%02d/%04d", date, mois, année))
-- Formatage décimal
print(string.format("%.4f",1/3))

Le résultat de l'exécution du code ci-dessus est :

基本格式化 Lua Tutorial
日期格式化 02/01/2014
0.3333

Autres exemples :

Exemple

string.format("%c", 83)                 -- Sortie S
string.format("%+d", 17.0)              -- Sortie +17
string.format("%05d", 17)               -- Sortie 00017
string.format("%o", 17)                 -- Sortie 21
string.format("%u", 3.14)               -- Sortie 3
string.format("%x", 13)                 -- Sortie d
string.format("%X", 13)                 -- Sortie D
string.format("%e", 1000)               -- Sortie 1.000000e+03
string.format("%E", 1000)               -- Sortie 1.000000E+03
string.format("%6.3f", 13)              -- Sortie 13.000
string.format("%q", "One\nTwo")         -- Sortie "One\
                                        --   Two"
string.format("%s", "monkey")           -- Sortie monkey
string.format("%10s", "monkey")         -- Sortie monkey
string.format("%5.3s", "monkey")        -- Sortie mon

Conversion de caractères et d'entiers

L'exemple suivant montre comment convertir entre des caractères et des entiers :

Exemple

-- Conversion de caractères
-- Convertir le premier caractère
print(string.byte("Lua"))
-- Convertir le troisième caractère
print(string.byte("Lua",3))
-- Convertir le dernier caractère
print(string.byte("Lua",-1))
-- Le deuxième caractère
print(string.byte("Lua",2))
-- Convertir l'avant-dernier caractère
print(string.byte("Lua",-2))

-- Convertir un code ASCII entier en un caractère
print(string.char(97))

Le résultat de l'exécution du code ci-dessus est :

76
97
97
117
117
a

Autres fonctions courantes

L'exemple suivant montre d'autres opérations sur les chaînes, telles que le calcul de la longueur d'une chaîne, la concaténation de chaînes, la répétition de chaînes, etc. :

Exemple

string1 = "www."
string2 = "example"
string3 = ".com"
-- Utiliser .. pour la concaténation de chaînes
print("Chaîne concaténée",string1..string2..string3)

-- Longueur de la chaîne
print("Longueur de la chaîne ",string.len(string2))

-- Copier la chaîne 2 fois
repeatedString = string.rep(string2,2)
print(repeatedString)

Le résultat de l'exécution du code ci-dessus est :

连接字符串    www.example.com
字符串长度     6
exampleexample

Correspondance de motifs

Les motifs de correspondance en Lua sont décrits directement avec des chaînes normales. Ils sont utilisés dans les fonctions de correspondance de motifsstring.find, string.gmatch, string.gsub, string.match。

Vous pouvez également utiliser des classes de caractères dans les chaînes de motifs.

Une classe de caractères désigne un élément de motif qui peut correspondre à n'importe quel caractère d'un jeu de caractères spécifique. Par exemple, la classe de caractères%dcorrespond à n'importe quel chiffre. Vous pouvez donc utiliser la chaîne de motif%d%d/%d%d/%d%d%d%dpour rechercherdd/mm/yyyydates au format :

Exemple

s = "La date limite est le 30/05/1999, ferme"
date = "%d%d/%d%d/%d%d%d%d"
print(string.sub(s, string.find(s, date)))    --> 30/05/1999

Le tableau suivant répertorie toutes les classes de caractères prises en charge par Lua :

Un seul caractère (sauf^$()%.[]*+-?) : correspond au caractère lui-même

  • . (point) : correspond à n'importe quel caractère
  • %a : correspond à n'importe quelle lettre
  • %c : correspond à n'importe quel caractère de contrôle (par ex., \n)
  • %d : correspond à n'importe quel chiffre
  • %l : correspond à n'importe quelle lettre minuscule
  • %p : correspond à n'importe quel signe de ponctuation
  • %s : correspond à n'importe quel caractère d'espacement
  • %u : correspond à n'importe quelle lettre majuscule
  • %w : correspond à tout caractère alphanumérique
  • %x : correspond à tout chiffre hexadécimal
  • %z : correspond à tout caractère représentant 0
  • %x (où x est un caractère non alphanumérique) : correspond au caractère x. Principalement utilisé pour gérer la correspondance des caractères ayant des fonctions spéciales dans les expressions (^$()%.[]*+-?), par exemple, %% correspond à %
  • [plusieurs classes de caractères] : correspond à tout caractère appartenant aux classes de caractères indiquées entre []. Par exemple, [%w_] correspond à toute lettre/chiffre ou au symbole de soulignement (_)
  • [^plusieurs classes de caractères] : correspond à tout caractère n'appartenant pas aux classes de caractères indiquées entre []. Par exemple, [^%s] correspond à tout caractère autre qu'un espace blanc

Lorsque les classes de caractères ci-dessus sont écrites en majuscules, elles correspondent à tout caractère qui n'appartient pas à cette classe de caractères. Par exemple, %S correspond à tout caractère autre qu'un espace blanc. Par exemple, '%A' correspond aux caractères non alphabétiques :

> print(string.gsub("hello, up-down!", "%A", "."))
hello..up.down.    4

Le nombre 4 ne fait pas partie du résultat de type chaîne ; c'est le deuxième résultat renvoyé par gsub, représentant le nombre de substitutions effectuées.

Dans la correspondance de motifs, certains caractères spéciaux ont une signification particulière. Les caractères spéciaux en Lua sont les suivants :

( ) . % + - * ? [ ^ $

'%' est utilisé comme caractère d'échappement pour les caractères spéciaux, donc '%.' correspond à un point ; '%%' correspond au caractère '%'. Le caractère d'échappement '%' peut être utilisé non seulement pour échapper des caractères spéciaux, mais aussi pour tous les caractères non alphabétiques.

Les éléments de motif peuvent être :

  • Une classe de caractères unique correspond à tout caractère de cette classe ;
  • Une classe de caractères unique suivie d'une '*', correspond à zéro ou plusieurs caractères de cette classe. Cette entrée correspond toujours à la chaîne la plus longue possible ;
  • Une classe de caractères unique suivie d'une '+', correspond à un ou plusieurs caractères de cette classe. Cette entrée correspond toujours à la chaîne la plus longue possible ;
  • Une classe de caractères unique suivie d'une '-', correspond à zéro ou plusieurs caractères de cette classe. Contrairement à '*', cette entrée correspond toujours à la chaîne la plus courte possible ;
  • Une classe de caractères unique suivie d'une '?', correspond à zéro ou un caractère de cette classe. Si possible, elle correspondra à un ;
  • %n, oùnpeut aller de 1 à 9; cette entrée correspond à une sous-chaîne égale à la capture numérotéen(décrite ci-dessous).
  • %bxy, oùxetysont deux caractères explicites; cette entrée correspond à une chaîne qui commence parxet se termine pary, et dans laquellexetyrestechaîneéquilibrée.xJust+1Cela signifie que, si vous lisez cette chaîne de gauche à droite, chaque fois que vous lisez unyJust-1, et lisez uny,ycelui à la toute fin%b().
  • %f[set]peut correspondre à une expression avec des parenthèses équilibrées., fait référence àmotif de frontièreensemble; cette entrée correspond à une chaîne vide situéeensembleavant un caractère dans [set],ensemble.\0a la même signification que celle décrite précédemment.

' comme si.

Motif :Motif^fait référence à une séquence d'éléments de motif.$' ancrera la correspondance au début de la chaîne.^' ancrera le processus de correspondance à la fin de la chaîne.$' et '

' apparaissent dans d'autres positions, ils n'ont aucune signification particulière et se représentent eux-mêmes.

Captures :Un motif peut encadrer un sous-motif avec des parenthèses ;captures.captures"(a*(.)%w(%s*))"Les sous-chaînes de la chaîne correspondante sont enregistrées pour une utilisation ultérieure."a*(.)%w(%s*)",.la partie est stockée dans la première capture%s*le caractère correspondant est la capture 2,

la partie correspondante est la capture 3.()Comme cas particulier, une capture vide"()aa()"capture la position actuelle dans la chaîne (qui est un nombre)."flaaap"appliqué à la chaîne

, il produira deux captures :