×

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] Patterns - Classes, Caracteres, Capturas e Cadeias
[Tutorial] Patterns - Classes, Caracteres, Capturas e Cadeias
Reppam
« Censeur »
1487529060000
    • Reppam#0000
    • Profil
    • Derniers messages
    • Tribu
#1
  2

Padrões

ㅤPadrões são usados por algumas funções Lua, como string.find, string.gmatch e string.match.
ㅤVeja um exemplo:
Code Lua

1
2
3
4
5
6
7
8
9
10
11
12
	pattern = "Este é um texto feio"
for palavra in string.gmatch(pattern,"%S+") do -- %S+ é o padrão utilizado, que significa todos os caracteres, exceto espaço.
print(palavra)
end

--[[ Resultado:
> Este
> é
> um
> texto
> feio
]]

Match simples
ㅤToda string é, de um jeito ou de outro, uma cadeia de patterns (padrões).
Code Lua

1
2
3
	pattern = "Atelier801"
print(string.match("As regras da empresa Atelier801 não são bem formuladas!"):match(pattern)) -- Resultado: Atelier801
print(string.match("As regras da empresa Atelier601 não são bem formuladas!"):match(pattern)) -- Resultado: nil

Classe de caracteres
ㅤUma classe de caracteres é uma cadeia composta por combinações generalizadas de caracteres. A pattern em maiúscula exerce o efeito contrário, ou seja, %L = %u e %U = %l.

ㅤㅤPatternㅤㅤㅤㅤㅤㅤㅤㅤㅤFunçãoㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤExemploㅤㅤㅤㅤㅤ
ㅤ.ㅤQuaisquer caractere82wuiemwdj8o&@#
ㅤ%aㅤQuaisquer letraaBcDeFgHiJkLmNoPqRsTuVwXyZ
ㅤ%lㅤQuaisquer letra minúsculaabcdefghijklmnopqrstuvwxyz
ㅤ%uㅤQuaisquer letra maiúsculaABCDEFGHIJKLMNOPQRSTUVWXYZ
ㅤ%pㅤQuaisquer caractere de pontuação+!;,.#^
ㅤ%wㅤQuaisquer letra ou númeroaBcDeFgHiJkLmNoPqRsTuVwXyZ0123456789
ㅤ%dㅤQuaisquer número0123456789
ㅤ%sㅤUm espaço em branco , \n, \r
ㅤ%cㅤUm caractere de controle\n, \t, \v
ㅤ%xㅤUm número hexadecimal0123456789ABCDEF
ㅤ%zㅤUm caractere nulo\0
ㅤ%fㅤPadrão de fronteira %f[cadeia]
ㅤ%bㅤPadrão de captura balanceada %bDeAté


Caracteres mágicos
ㅤCaracteres mágicos são usados para adicionar algum efeito nas classes de caracteres. Estes podem deixar de ser mágicos ao utilizar %caractere. Por exemplo: %% = %, %* = *
ㅤㅤCaractereㅤㅤㅤㅤㅤㅤㅤㅤㅤFunçãoㅤㅤㅤㅤㅤㅤㅤ
ㅤ^ㅤInício da string
ㅤ$ㅤFim da string
ㅤ()ㅤSelecionador de captura
ㅤ%ㅤAnula caracteres mágicos, como %^ = ^ não mágico. Também possibilita a chamada de uma captura com %1-%9
ㅤ[]ㅤCadeia
ㅤ?ㅤUm item encontrado 0 ou 1 vez
ㅤ*ㅤUm item encontrado 0 ou mais vezes
ㅤ+ㅤUm item encontrado 1 ou mais vezes
ㅤ-ㅤUm item encontrado a menor quantidade de vezes possível


ㅤVeja um exemplo com os quantificadores ?, +, - e *:
Code Lua

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
	pattern = "%d?%u"
print(string.match("1Direction",pattern)) -- Resultado: 1D
print(string.match("Direction",pattern)) -- Resultado: D
print(string.match("1direction",pattern)) -- Resultado: nil

pattern = "%d+"
print(string.match("300 pessoas morrerão este ano",pattern)) -- Resultado: 300
print(string.match("Nenhuma pessoas morrerá este ano",pattern)) -- Resultado: nil

pattern = "%a*%p"
print(string.match("300 pessoa.",pattern)) -- Resultado: pessoa.
print(string.match("10000!",pattern)) -- Resultado: !

pattern = "C:/Users/Transformice/Lua"
print(string.match("/.-/")) -- Resultado: /Users/
print(string.match("/.*/")) -- Resultado: /Users/Transformice/

Âncoras
ㅤÂncoras indicam uma pattern que certifica o começo e o fim de uma string.
ㅤVeja um exemplo:
Code Lua

1
2
3
4
5
6
7
8
9
10
11
12
	numeros = "10, 20,30, 40, 50"
pattern = "%d+"
for numero in string.gmatch(numeros,pattern) do
print(numero)
end
--[[ Resultado:
> 10
> 20
> 30
> 40
> 50
]]

ㅤUma âncora no início ( ^ ):
Code Lua

1
2
3
4
5
6
7
8
	numeros = "123,456,789"
pattern = "^%d+"
for numero in string.gmatch(numeros,pattern) do
print(numeros)
end
--[[ Resultado:
> 123
]]

Code Lua

1
2
3
4
5
6
7
8
	numeros = "teste,123,456,789"
pattern = "^%d+"
for numero in string.gmatch(numeros,pattern) do
print(numeros)
end
--[[ Resultado:
> nil
]]

ㅤUma âncora no fim ( $ ):
Code Lua

1
2
3
4
5
6
7
8
	numeros = "123,456,789"
pattern = "%d+$"
for numero in string.gmatch(numeros,pattern) do
print(numeros)
end
--[[ Resultado:
> 789
]]

Code Lua

1
2
3
4
5
6
7
8
	numeros = "123,456,789, teste"
pattern = "%d+$"
for numero in string.gmatch(numeros,pattern) do
print(numeros)
end
--[[ Resultado:
> nil
]]

Cadeias
ㅤSão usados quando uma única classe de caracteres não pode realizar todo o trabalho. Usa-se [ ]
ㅤVeja um exemplo:
Code Lua

1
2
3
4
5
6
7
8
9
10
11
12
13
	pattern = "[ohle%d]+" -- "e", "l", "h", "o", "%d"
texto = "Vaca joelho vermelho feio coelho"
for palavra in string.gmatch(texto,pattern) do
print(palavra)
end
--[[ Resultado:
> oelho
> e
> elho
> e
> o
> oelho
]]

Raios
ㅤVocê pode usar um raio de caracteres, onde x-y, x é o início e y o final. Como 0-9 = 0,1,2,3,5,6,7,8,9
ㅤVeja um exemplo:
Code Lua

1
2
3
4
5
6
7
8
9
10
	pattern = "[e-o6-9]+"
text = "eu amo 0123456789"
for texto in string.gmatch(text,pattern) do
print(texto)
end
--[[ Resultado:
> e
> mo
> 6789
]]

Complementos
ㅤComplementos indicados por ^ significam que a cadeira capturada não deve ter tais caracteres
ㅤVeja um exemplo:
Code Lua

1
2
3
4
5
6
7
8
9
10
11
	pattern = "[^%s%d]+"
text = "Olá eu tenho 10 anos!"
for palavra in string.gmatch(text,pattern) do
print(palavra)
end
--[[ Resultado:
> Olá
> eu
> tenho
> anos!
]]

Capturas
ㅤCapturas retornam o padrão desejado de uma string. Usa-se ( )
ㅤVeja um exemplo:
Code Lua

1
2
3
4
5
6
7
8
9
	pattern = "(%w+) ?= ?([\"'])(.*)%2" -- O "%2" atribui o valor identificado em ([\"']), ou seja, não poderá ser \" e ', apenas \" e \" ou ' e '
texto = "Eu sou a pessoa que digita o atributo eusoulisho= 'Verdadeiro' e ninguém reclama!"
nomeAtributo,x,valorAtributo = string.match(texto,pattern)
print(nomeAtributo)
print(valorAtributo)
--[[ Resultado:
> eusoulisho
> Verdadeiro
]]


Exercícios


1. Senha
ㅤCrie uma função que valide uma senha. Esta deve conter ao menos:
ㅤㅤ• 2 números;
ㅤㅤ• 5 letras maiúsculas ou minúsculas;
ㅤㅤ• A palavra lua;
ㅤㅤ• Um ponto de interrogação
Resposta
Code Lua

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
	verificarSenha = function(senha)
local verificado = false
verificado = senha:match("%d.*%d") ~= nil -- 2 números
verificado = senha:match("%a.*%a.*%a.*%a.*%a") ~= nil -- 5 letras
verificado = senha:match("lua") ~= nil -- palavra "lua"
verificado = senha:match("%?") ~= nil -- interrogação (note que é necessário o uso de %)
if verificado then
return "Senha verificada!"
else
return "Senha inválida! :("
end
end
print(verificarSenha("teste?lua69")) --> Verificada!
print(verificarSenha("a6b9?lua")) --> Verificada!
print(verificarSenha("minhasenha1234")) --> Não verificada!


2. XML
ㅤCrie uma função que capture todos os atributos de cada piso do mapa quando um mapa novo iniciar.

Resposta
Code Lua

1
2
3
4
5
6
7
8
9
10
11
12
13
14
	pisos = {}
eventNewGame = function()
pisos = {} -- Limpa a tabela
local xml = tfm.get.room.xmlMapInfo.xml
local tagPisos = xml:match("<S>(.*)</S>") or "" -- Coleta todas as tag <S do script
for piso in tagPisos:gmatch("<S (.-)/>") do
local atributos = {}
for atributo,_,valor in piso:gmatch("(%w+) ?= ?([\"'])(.-)%2") do
atributos[atributo] = valor
end
pisos[#pisos + 1] = atributos
end
print(pisos[1].X) -- Imprimirá a coordenada X do primeiro piso
end

Dernière modification le 1492021260000
Konynno
« Consul »
1487529300000
    • Konynno#0000
    • Profil
    • Derniers messages
    • Tribu
#2
  0
Interessante. Vou praticar. Amei a ideia de exercícios
Brenower
« Censeur »
1487530080000
    • Brenower#0000
    • Profil
    • Derniers messages
    • Tribu
#3
  0
ótimo tutorial <3
Hydroper
« Citoyen »
1487535300000
    • Hydroper#0528
    • Profil
    • Derniers messages
    • Tribu
#4
  0
É também uma péssima ideia validar/interpretar uma string sem processar uma codificação específica de caracteres. As mensagens do chat no TFM usam UTF-8 pelo jeito (basta verificar que o caractere 'ã' é codificado com 2 bytes, que são: 0xC3 e 0xA3).
Mescouleur
« Citoyen »
1487556120000
    • Mescouleur#0000
    • Profil
    • Derniers messages
#5
  0
Ebaaa!
Ficou muito legal!
Ricat
« Consul »
1487611980000
    • Ricat#3758
    • Profil
    • Derniers messages
    • Tribu
#6
  0
Parabéns!
Tá muito bem explicado.
Mescouleur
« Citoyen »
1487624520000
    • Mescouleur#0000
    • Profil
    • Derniers messages
#7
  0
Amei tanto que vou até comentar de novo
Ficou muito bom cara
Bortverde
« Consul »
1487709480000
    • Bortverde#0015
    • Profil
    • Derniers messages
    • Tribu
#8
  0
Uau
Quem diria que o TFM teria uma programação tão complexa com o Lua
Desde coisas simples até isso
Thanos
« Citoyen »
1487720880000
    • Thanos#1306
    • Profil
    • Derniers messages
    • Tribu
#9
  0
Essas coisas em português soam tão bizarras.

Mas mto bom, parabéns.
Jellymichey
« Censeur »
1492014420000
    • Jellymichey#0000
    • Profil
    • Derniers messages
    • Tribu
#10
  0
Lynezx a dit :
Essas coisas em português soam tão bizarras.

Mas mto bom, parabéns.

não se preocupe que vice-versa é igual ;)

como é possível encontrar os pisos se não existe a key xmlMapInfo na tabela room?

Dernière modification le 1492014600000
Reppam
« Censeur »
1492112280000
    • Reppam#0000
    • Profil
    • Derniers messages
    • Tribu
#11
  0
Jellymichey a dit :
Lynezx a dit :
Essas coisas em português soam tão bizarras.

Mas mto bom, parabéns.

não se preocupe que vice-versa é igual ;)

como é possível encontrar os pisos se não existe a key xmlMapInfo na tabela room?

Tem sim, tfm.get.room.xmlMapInfo.xml:match("<S>(.-)</S>")
Jellymichey
« Censeur »
1492178820000
    • Jellymichey#0000
    • Profil
    • Derniers messages
    • Tribu
#12
  0
Reppam a dit :
Jellymichey a dit :
Lynezx a dit :
Essas coisas em português soam tão bizarras.

Mas mto bom, parabéns.

não se preocupe que vice-versa é igual ;)

como é possível encontrar os pisos se não existe a key xmlMapInfo na tabela room?

Tem sim, tfm.get.room.xmlMapInfo.xml:match("<S>(.-)</S>")

em foreach não aparece
Brenower
« Censeur »
1492179360000
    • Brenower#0000
    • Profil
    • Derniers messages
    • Tribu
#13
  0
Jellymichey a dit :
Reppam a dit :
Jellymichey a dit :
Lynezx a dit :
Essas coisas em português soam tão bizarras.

Mas mto bom, parabéns.

não se preocupe que vice-versa é igual ;)

como é possível encontrar os pisos se não existe a key xmlMapInfo na tabela room?

Tem sim, tfm.get.room.xmlMapInfo.xml:match("<S>(.-)</S>")

em foreach não aparece

Foreach é obsoleto, não deve ser usado
Jellymichey
« Censeur »
1492179540000
    • Jellymichey#0000
    • Profil
    • Derniers messages
    • Tribu
#14
  0
Brenower a dit :
Jellymichey a dit :
Reppam a dit :
Jellymichey a dit :
Lynezx a dit :
Essas coisas em português soam tão bizarras.

Mas mto bom, parabéns.

não se preocupe que vice-versa é igual ;)

como é possível encontrar os pisos se não existe a key xmlMapInfo na tabela room?

Tem sim, tfm.get.room.xmlMapInfo.xml:match("<S>(.-)</S>")

em foreach não aparece

Foreach é obsoleto, não deve ser usado

e quando eu mandei printar isso deu expected .-.
Laagaadoo
« Citoyen »
1492186740000
    • Laagaadoo#0000
    • Profil
    • Derniers messages
    • Tribu
#15
  0
Jellymichey a dit :
Lynezx a dit :
Essas coisas em português soam tão bizarras.

Mas mto bom, parabéns.

não se preocupe que vice-versa é igual ;)

como é possível encontrar os pisos se não existe a key xmlMapInfo na tabela room?

A tabela xmlMapInfo só existe quando vc roda um mapa novo com tfm.exec.newGame
Jellymichey
« Censeur »
1492453260000
    • Jellymichey#0000
    • Profil
    • Derniers messages
    • Tribu
#16
  0
Laagaadoo a dit :
Jellymichey a dit :
Lynezx a dit :
Essas coisas em português soam tão bizarras.

Mas mto bom, parabéns.

não se preocupe que vice-versa é igual ;)

como é possível encontrar os pisos se não existe a key xmlMapInfo na tabela room?

A tabela xmlMapInfo só existe quando vc roda um mapa novo com tfm.exec.newGame

mesmo assim não consigo dar print ao xmlMapInfo .-.
Laagaadoo
« Citoyen »
1492454220000
    • Laagaadoo#0000
    • Profil
    • Derniers messages
    • Tribu
#17
  0
Jellymichey a dit :
Laagaadoo a dit :
Jellymichey a dit :
Lynezx a dit :
Essas coisas em português soam tão bizarras.

Mas mto bom, parabéns.

não se preocupe que vice-versa é igual ;)

como é possível encontrar os pisos se não existe a key xmlMapInfo na tabela room?

A tabela xmlMapInfo só existe quando vc roda um mapa novo com tfm.exec.newGame

mesmo assim não consigo dar print ao xmlMapInfo .-.

Code Lua

1
2
3
4
5
tfm.exec.newGame('@315801')

function eventNewGame()
print(tfm.get.room.xmlMapInfo)
end
Mapas vanilla não tem XML
  • Forums
  • /
  • Transformice
  • /
  • Modules
  • /
  • [Tutorial] Patterns - Classes, Caracteres, Capturas e Cadeias
© Atelier801 2018

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

Version 1.27