Recherche…


Syntaxe

  • string.find (str, pattern [, init [, plain]]) - Retourne l'index de début et de fin de la correspondance dans str

  • string.match (str, pattern [, index]) - Correspond à un modèle une fois (à partir de l'index)

  • string.gmatch (str, pattern) - Retourne une fonction qui parcourt toutes les correspondances dans str

  • string.gsub (str, pattern, repl [, n]) - Remplace les sous-chaînes (jusqu'à un maximum de n fois)

  • . représente tous les caractères

  • %a représente toutes les lettres

  • %l représente toutes les lettres minuscules

  • %u représente toutes les lettres majuscules

  • %d représente tous les chiffres

  • %x représente tous les chiffres hexadécimaux

  • %s représente tous les caractères d'espacement

  • %p représente tous les caractères de ponctuation

  • %g représente tous les caractères imprimables à l' exception de l'espace

  • %c représente tous les caractères de contrôle

  • [set] représente la classe qui est l'union de tous les caractères de l'ensemble.

  • [^set] représente le complément de l'ensemble

  • * greedy correspond à 0 ou plusieurs occurrences de la classe de caractères précédente

  • + greedy match 1 ou plusieurs occurrences de la classe de caractères précédente

  • - lazy match 0 ou plusieurs occurrences de la classe de caractères précédente

  • ? correspond exactement à 0 ou 1 occurrence de la classe de caractères précédente

Remarques

Dans certains exemples, la notation (<string literal>):function <string literal> est utilisée, ce qui équivaut à string.function(<string literal>, <string literal>) car toutes les chaînes peuvent être __index ensemble de champs __index . à la table de string .

Lua correspondance des modèles

Au lieu d'utiliser l'expression rationnelle, la bibliothèque de chaînes Lua possède un ensemble spécial de caractères utilisé dans les correspondances de syntaxe. Les deux peuvent être très similaires, mais la correspondance de modèle Lua est plus limitée et a une syntaxe différente. Par exemple, la séquence de caractères %a correspond à n'importe quelle lettre, tandis que sa version majuscule représente tous les caractères autres que des lettres , toutes les classes de caractères (une séquence de caractères pouvant correspondre à un ensemble d'éléments).

Classe de personnage Section correspondant
%une lettres (AZ, az)
% c caractères de contrôle (\ n, \ t, \ r, ...)
%ré chiffres (0-9)
% l lettre minuscule (az)
% p caractères de ponctuation (!,?, &, ...)
% s caractères d'espace
% u lettres capitales
% w caractères alphanumériques (AZ, az, 0-9)
%X chiffres hexadécimaux (\ 3, \ 4, ...)
% z le personnage avec la représentation 0
. Correspond à n'importe quel personnage

Comme mentionné ci-dessus, toute version majuscule de ces classes représente le complément de la classe. Par exemple, %D correspondra à toute séquence de caractères autre que des chiffres:

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

En plus des classes de caractères, certains caractères ont des fonctions spéciales comme motifs:

( ) % . + - * [ ? ^ $

Le caractère % représente un caractère échappé, faisant %? correspond à une interrogation et %% correspond au symbole de pourcentage. Vous pouvez utiliser le caractère % avec tout autre caractère non alphanumérique. Par conséquent, si vous devez échapper, par exemple, à une citation, vous devez utiliser \\ avant celle-ci, qui échappe à tout caractère d'une chaîne lua.

Un jeu de caractères, représenté entre crochets ( [] ), vous permet de créer une classe de caractères spéciaux, combinant différentes classes et caractères uniques:

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

Vous pouvez obtenir le complément du jeu de caractères en le démarrant avec ^ :

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

Dans cet exemple, string.match trouvera la première occurrence qui n'est pas b , a ou r .

Les patterns peuvent être plus utiles à l'aide de modificateurs de répétition / facultatifs, les patterns de lua offrent ces quatre caractères:

Personnage Modificateur
+ Une ou plusieurs répétitions
* Zéro ou plus de répétitions
- Aussi zéro ou plusieurs répétitions
? Facultatif (zéro ou une occurrence)

Le caractère + représente un ou plusieurs caractères correspondants dans la séquence et restituera toujours la séquence correspondante la plus longue:

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

Comme vous pouvez le voir, * est similaire à + , mais il accepte les occurrences de caractères et est généralement utilisé pour faire correspondre des espaces facultatifs entre différents modèles.

Le caractère - est également similaire à * , mais au lieu de renvoyer la plus longue séquence correspondante, elle correspond à la plus courte.

Le modificateur ? correspond à un caractère facultatif, ce qui vous permet de faire correspondre, par exemple, un chiffre négatif:

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

Le moteur d'appariement de motifs Lua fournit quelques éléments de correspondance de motifs supplémentaires:

Objet de caractère La description
%n pour n entre 1 et 9 correspond une sous-chaîne égale à la n-ème chaîne capturée
%bxy correspond à la sous-chaîne entre deux caractères distincts (paire équilibrée de x et y )
%f[set] modèle de frontière: correspond à une chaîne vide à n'importe quelle position de sorte que le caractère suivant
appartient à définir et le caractère précédent n'appartient pas à définir

string.find (Introduction)

La fonction de find

Tout d'abord, regardons la fonction string.find en général:

La fonction string.find (s, substr [, init [, plain]]) renvoie l'index de début et de fin d'une sous-chaîne si elle est trouvée et nulle sinon, à partir de l'index init si elle est fournie (la valeur par défaut est 1).

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

Introduire des Patterns

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

Tous sauf les caractères suivants représentent eux-mêmes ^$()%.[]*+-?) . N'importe lequel de ces caractères peut être représenté par un % suivant le caractère lui-même.

("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

La fonction `gmatch`

Comment ça marche

La fonction string.gmatch prendra une chaîne d'entrée et un motif. Ce modèle décrit ce qu'il faut réellement récupérer. Cette fonction renverra une fonction qui est en réalité un itérateur. Le résultat de cet itérateur correspondra au motif.

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

Présentation des captures:

Ceci est très similaire à la fonction normale, mais elle ne renverra que les captures au lieu de la correspondance complète.

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

La fonction gsub

ne confondez pas avec la fonction string.sub, qui retourne une sous-chaîne!

Comment ça marche

argument de chaîne

("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

argument de fonction

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

argument de table

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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow