×

Langue

Fermer
Atelier 801
  • Forums
  • Dev Tracker
  • Connexion
    • English Français
      Português do Brasil Español
      Türkçe Polski
      Magyar Română
      العربية Skandinavisk
      Nederlands Deutsch
      Bahasa Indonesia Русский
      中文 Filipino
      Lietuvių kalba 日本語
      Suomi עברית
      Italiano Česky
      Hrvatski Slovensky
      Български Latviešu
      Estonian
  • Langue
  • Forums
  • /
  • Transformice
  • /
  • Modules
  • /
  • [Tutorial] lpeg matching
[Tutorial] lpeg matching
Bolodefchoco
« Sénateur »
1547333580000
    • Bolodefchoco#0095
    • Profil
    • Derniers messages
    • Tribu
#1
  7
  • Intro
  • Funções
  • Operadores
lpeg (ou LuaPEG) é uma Parsing Expression Grammars para Lua.

Em resumo, são mais semelhantes a Regex que Patterns (e é uma grande ajuda quando patterns não são suficientes).

Um tutorial super básico sobre essa ferramenta.
(Faltam muitas outras coisas, aqui é só uma apresentação básica e posso acrescentar caso vocês se interessem)
P
Uma string literal (sem pattern) pode ser feita com a função P.
Code Lua

1
2
3
4
print( lpeg.match( lpeg.P("hi"), "hi, my name is Bolo" ) ) --> 3

-- Equivalência
print(string.match("hi, my name is Bolo", "^hi()")) --> 3

R
Use a função R para a primeira ocorrência de uma range (intervalo).
Code Lua

1
2
3
4
print( lpeg.match( lpeg.R("69"), "9-8080-9090" ) ) --> 2

-- Equivalência
print(string.match("9-8080-9090", "^[6-9]()")) --> 2

S
Use a função S para a primeira ocorrência de um set.
Code Lua

1
2
3
4
print( lpeg.match( lpeg.S("abc"), "ant-man" ) ) --> 2

-- Equivalência
print(string.match("ant-man", "^[abc]()")) --> 2
Operador ^
O operador ^ é utilizado para definir a quantidade de ocorrências de uma pattern.
Caso o número seja positivo, pode ser traduzido para "pelo menos n"
Caso o número seja 0, pode ser traduzido para "n*".
Caso o número seja negativo, pode ser traduzido para "no máximo n".
Code Lua

1
2
3
4
5
6
7
8
9
10
print( lpeg.match( lpeg.P("o") ^ 1, "oooooooh" ) ) --> 8
print( lpeg.match( lpeg.P("o") ^ 2, "oooooooh" ) ) --> 8
print( lpeg.match( lpeg.P("o") ^ -2, "oh" ) ) --> 2
print( lpeg.match( lpeg.P("o") ^ 0, "ooh" ) ) --> 3

-- Equivalência
print(string.match("oooooooh", "^o+()")) --> 8
print(string.match("oooooooh", "^oo+()")) --> 8
print(string.match("oh", "^oo?()[^o]") or string.match("oh", "^oo?()$")) --> 2
print(string.match("ooh", "^o*()")) --> 3

Operador *
O operador * é utilizado para concatenar duas patterns.
Code Lua

1
2
3
4
print( lpeg.match( lpeg.P("my name is ") * lpeg.R("az") ^ 1, "my name is bolo" ) ) --> 13

-- Equivalência
print(string.match("my name is bolo", "my name is [a-z]+()")) --> 16

Operador +
O operador + é utilizado para quando duas patterns podem ser possíveis, um or.
Code Lua

1
2
3
4
print( lpeg.match( ( lpeg.P("hi") + lpeg.P("hello") ), "hello" ) ) --> 6

-- Equivalência
print(string.match("hello", "hi()") or string.match("hello", "hello()")) --> 16

Operador -
O operador - é utilizado para quando uma pattern não deva existir para que outra seja matched. Um not y and x or nil.
Caso seja usado como unário (-x), será traduzido para "" - x.
Code Lua

1
2
3
4
print( lpeg.match( ( lpeg.R("az") - lpeg.R("09") ), "biscuit" ) ) --> 2 (porque não começa com números)

-- Equivalência
print(string.find("biscuit", "^[^0-9]") and string.match("biscuit", "^[a-z]()")) --> 2

Operador /
O operador / é utilizado para retorno.
Caso seja uma string (pat / x), x é retornado como captura caso pat seja válido.
Caso seja uma tabela (pat / { [x]=y, ... }) é retornado como captura o valor do índice encontrado na pattern.
Caso seja uma função (pat / f) é retornada o valor da captura como parâmetro da função.
Code Lua

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
print( lpeg.match( ( lpeg.P("b") / "milk" ), "biscuit" ) ) --> 'milk' -- *1
print( lpeg.match( (lpeg.S("012") / { ["0"] = "a", ["1"] = "b", ["2"] = "c" } ) ^ 1, "00120" ) ) --> 'a', 'a', 'b', 'c', 'a' -- *2
print( lpeg.match( (lpeg.R("az") / string.upper ), "a" ) ) --> 'A' -- *3

-- Equivalência
-- *1
print(string.find("biscuit", "^b") and "milk") -- 'milk'
-- *2
local tbl = { ["0"] = "a", ["1"] = "b", ["2"] = "c" }
local ret = { }
string.gsub("00120", "[012]", function(c)
if tbl[c] then
ret[#ret + 1] = tbl[c]
end
end)
print(ret)
-- *3
local match = string.match("a", "^([az])")
print(match and string.upper(match) or nil) -- 'A'

Dernière modification le 1547397780000
Hugotitas
« Citoyen »
1547334120000
    • Hugotitas#0000
    • Profil
    • Derniers messages
    • Tribu
#2
  0
Parece ser bom, vou ler daqui a pouco.
Parabéns bolo!
Bloom
« Héliaste »
1547358360000
    • Bloom#6766
    • Profil
    • Derniers messages
#3
  0
Parabéns Bolo, ótimo tópico
Fly
« Citoyen »
1547398320000
    • Fly#8215
    • Profil
    • Derniers messages
    • Tribu
#4
  0
Muito útil. Obrigado por compartilhar
Rianmojang1
« Citoyen »
1547404560000
    • Rianmojang1#0000
    • Profil
    • Derniers messages
    • Tribu
#5
  0
Muito bom seu tópico
Parabens!
  • Forums
  • /
  • Transformice
  • /
  • Modules
  • /
  • [Tutorial] lpeg matching
© Atelier801 2018

Equipe Conditions Générales d'Utilisation Politique de Confidentialité Contact

Version 1.27