Zoeken…


Syntaxis

  • string.find (str, pattern [, init [, plain]]) - Retourneert de begin- en eindindex van de overeenkomst in str

  • string.match (str, patroon [, index]) - Komt één keer overeen met een patroon (beginnend bij index)

  • string.gmatch (str, patroon) - Retourneert een functie die alle overeenkomsten in str doorloopt

  • string.gsub (str, pattern, repl [, n]) - Vervangt substrings (maximaal n keer)

  • . vertegenwoordigt alle karakters

  • %a staat voor alle letters

  • %l vertegenwoordigt alle kleine letters

  • %u vertegenwoordigt alle hoofdletters

  • %d staat voor alle cijfers

  • %x staat voor alle hexadecimale cijfers

  • %s vertegenwoordigt alle witruimtetekens

  • %p staat voor alle leestekens

  • %g staat voor alle afdrukbare tekens behalve de spatie

  • %c vertegenwoordigt alle controletekens

  • [set] vertegenwoordigt de klasse die de unie van alle tekens in set is.

  • [^set] vertegenwoordigt het complement van set

  • * hebzuchtige match 0 of meer voorkomen van vorige karakterklasse

  • + hebzuchtige match 1 of meer voorvallen uit de vorige karakterklasse

  • - luie match 0 of meer keren voorkomen uit vorige karakterklasse

  • ? komen exact overeen met 0 of 1 exemplaar van vorige tekenklasse

Opmerkingen

In sommige voorbeelden wordt de notatie (<string literal>):function <string literal> gebruikt, wat overeenkomt met string.function(<string literal>, <string literal>) omdat alle strings een metatabel hebben met de __index naar de string .

Lua-patroonovereenkomst

In plaats van regex te gebruiken, heeft de Lua-tekenreeksbibliotheek een speciale set tekens die worden gebruikt in syntaxisovereenkomsten. Beide kunnen erg op elkaar lijken, maar Lua-patroonovereenkomst is beperkter en heeft een andere syntaxis. De tekenreeks %a komt bijvoorbeeld overeen met elke letter, terwijl de hoofdletterversie alle niet-letters bevat , alle tekenklassen (een tekenreeks die, als patroon, kan overeenkomen met een set items) hieronder worden weergegeven.

Karakterklasse Bijpassende sectie
%een letters (AZ, az)
% c controle karakters (\ n, \ t, \ r, ...)
% d cijfers (0-9)
% l kleine letter (az)
% p leestekens (!,?, &, ...)
% s spatie tekens
% u hoofdletters
% w alfanumerieke tekens (AZ, az, 0-9)
%X hexadecimale cijfers (\ 3, \ 4, ...)
% z het karakter met weergave 0
. Komt overeen met elk karakter

Zoals hierboven vermeld, vertegenwoordigt elke hoofdletterversie van die klassen het complement van de klasse. %D komt bijvoorbeeld overeen met elke niet-cijferige tekenreeks:

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

Naast tekenklassen hebben sommige tekens speciale functies als patronen:

( ) % . + - * [ ? ^ $

Het teken % vertegenwoordigt een tekenontsnapping, waardoor %? match een ondervraging en %% overeen met het percentagesymbool. U kunt het % -teken gebruiken met elk ander niet-alfanumeriek teken, dus als u bijvoorbeeld een aanhalingsteken wilt laten ontsnappen, moet u daarvoor \\ gebruiken, dat elk teken uit een lua-reeks ontsnapt.

Met een tekenset, weergegeven tussen vierkante haken ( [] ), kunt u een speciale tekenklasse maken, die verschillende klassen en afzonderlijke tekens combineert:

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

Je kunt het complement van de tekenset krijgen door het te beginnen met ^ :

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

In dit voorbeeld vindt string.match het eerste exemplaar dat geen b , a of r is .

Patronen kunnen nuttiger zijn met behulp van herhaling / optionele modificaties, patronen in lua bieden deze vier tekens:

Karakter wijziger
+ Een of meer herhalingen
* Nul of meer herhalingen
- Ook nul of meer herhalingen
? Optioneel (nul of één keer voorkomen)

Het teken + vertegenwoordigt een of meer overeenkomende tekens in de reeks en retourneert altijd de langste overeenkomende reeks:

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

Zoals u kunt zien, is * vergelijkbaar met + , maar het accepteert nul tekens en wordt vaak gebruikt om optionele spaties tussen verschillende patronen te matchen.

Het teken - lijkt ook op * , maar in plaats van de langste overeenkomende reeks terug te geven, komt deze overeen met de kortste.

De modifier ? komt overeen met een optioneel teken, zodat u bijvoorbeeld een negatief cijfer kunt vinden:

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

De Lua-engine voor het matchen van patronen biedt een paar extra items voor het matchen van patronen:

Karakter item Beschrijving
%n voor n tussen 1 en 9 komt een substring overeen met de n-de gevangen string
%bxy overeenkomsten tussen twee verschillende tekens (gebalanceerd paar x en y )
%f[set] grenspatroon: komt overeen met een lege string op elke positie zodat het volgende karakter
hoort bij set en het vorige karakter hoort niet bij set

string.find (Introductie)

De find functie

Laten we eerst de functie string.find in het algemeen bekijken:

De functie string.find (s, substr [, init [, plain]]) retourneert de start- en string.find (s, substr [, init [, plain]]) van een substring indien gevonden, en nihil anders, beginnend bij de index init als deze is opgegeven (standaardwaarde 1).

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

Patronen introduceren

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

Alle behalve de volgende tekens vertegenwoordigen ^$()%.[]*+-?) . Elk van deze tekens kan worden weergegeven met een % na het teken zelf.

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

De `gmatch` functie

Hoe het werkt

De string.gmatch functie neemt een invoertekenreeks en een patroon. Dit patroon beschrijft wat u daadwerkelijk terugkrijgt. Deze functie retourneert een functie die eigenlijk een iterator is. Het resultaat van deze iterator komt overeen met het patroon.

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

Introductie van vastleggingen:

Dit lijkt erg op de normale functie, maar in plaats daarvan worden alleen de vastleggingen geretourneerd.

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

De gsub-functie

verwar niet met de string.sub-functie, die een substring teruggeeft!

Hoe het werkt

string argument

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

functie argument

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

tabel argument

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow