Lua > Validation > Regexp

1. Hogyan teszteljük az egész számokat?


isInt("0") -- IGAZ
isInt("678") -- IGAZ
isInt("-42") -- IGAZ
isInt("--34") -- HAMIS
isInt("78.2") -- HAMIS
isInt("0a") -- HAMIS

Hát közel sem fedtük le az összes lehetséges esetet, de kiindulásnak jó lesz.
[code]
function isInt(input)

-- illeszkedő maszk esetén az inputtal tér vissza,
-- ellenkező esetben nil
return string.match(input, "[-+]?%d+")
end
function assert_equal(expected, actual)

expected = expected or "NIL"

if expected == actual then
print("[+] a szamitott ".. actual .." egyenlo a vart "..expected.." ertekkel")
else
print("[-] a szamitott ".. actual .." nem egyenlo a vart "..expected.." ertekkel")
end
end

function test_isInt()

-- POS --
assert_equal("0", isInt("0"))
assert_equal("678", isInt("678"))
assert_equal("-42", isInt("-42"))

-- NEG --
assert_equal(nil, isInt("--34"))
assert_equal(nil, isInt("78.2"))
assert_equal(nil, isInt("0a"))

end
test_isInt()
[/code]

És rögtön látjuk, hogy van valami bibi a mintaillesztéssel.


[+] a szamitott 0 egyenlo a vart 0 ertekkel
[+] a szamitott 678 egyenlo a vart 678 ertekkel
[+] a szamitott -42 egyenlo a vart -42 ertekkel
[-] a szamitott -34 nem egyenlo a vart NIL ertekkel
[-] a szamitott 78 nem egyenlo a vart NIL ertekkel
[-] a szamitott 0 nem egyenlo a vart NIL ertekkel

Mi is a gond ezzel a kifejezéssel? "[-+]?%d+"
Nincs lezárva soreleje és sorvége karakterrel.
Akkor most javítva: "^[-+]?%d+$"


[+] a szamitott 0 egyenlo a vart 0 ertekkel
[+] a szamitott 678 egyenlo a vart 678 ertekkel
[+] a szamitott -42 egyenlo a vart -42 ertekkel
input:14: attempt to concatenate local 'actual' (a nil value)

Újabb hiba. Elég nehéz sztringgel összefűzni egy logikai igaz vagy hamis értéket. Javítás:

actual = actual or "NIL" -- beszúrása expected = expected or "NIL" sor alá

Most kéne kigyulladnia a zöld lámpának...

Kód: http://foofighter.pastebin.com/UBYi1UwM

2. Hogyan teszteljünk mail-címet?

Minden mail-cím tartalmaz egy @ karaktert. Bontsuk a feladatot kukac utáni és kukac előtti részre:

@ utáni rész, a domain

@ előtti rész

Angol abc betűi és a pont megengedett csak.


function isMail(input)

  -- %w = [a-z0-9]
  before_at = "[-%w]+"
  after_at  = "@[-%w]+%.%w+"
  return string.match(input, "^"..before_at.."@"..after_at.."$")
end

[b]3. Hogyan teszteljük a gmail-címet?

-- only letters (a-z), numbers (0-9), and periods (.) are allowed. --
-- your username must be between 6 and 30 characters long --

???

Kódtesztelés: http://www.lua.org/cgi-bin/demo
Forrás: http://www.lua.org/pil/20.2.html

Hozzászólások