Autor Wątek: [PERL] Regex  (Przeczytany 1275 razy)

Offline Bloodian

  • Użytkownik

# Maj 05, 2012, 20:39:33
Mam male zadanie do zrobienia w PERLu.
Zostal mi jeden podpunkt:



W mojej naturze nie lezy zostawianie mojej roboty innym ludziom i wiem ze jedna z cech informatyka powinno byc szybkie czytanie i uczenie sie z dokumentacji, ale ja naprawde nie mam sily sie uczyc calej skladni tylko do tego zadania.
Moglbym prosic aby ktos napisal mi kod ktory by weryfikowal taki adres email ?
Dzieki.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Liosan

  • Redaktor

  • +1
# Maj 05, 2012, 21:42:00
Perl? Wow :D

Składnia regexpów w perlu jest (prawie) taka sama jak w bashowej komendzie grep, która się niezwykle w życiu przydatne ;) Warto się ich nauczyć moim zdaniem. A jeśli znasz jakąkolwiek składnię regexpów (a trzeba ;)), to te dwa akapity - klik, klik - Ci powinny wystarczyć.

Liosan

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Maj 06, 2012, 17:39:07
Może jakoś tak?
[a-zA-Z0-9_+.\-]@[a-zA-Z0-9\-.]Ale on nie sprawdza dokładnie tego. Zapisanie całości tych zasad do wyrażenia regularnego z uwzględnieniem wszystkich ograniczeń byłoby bardzo trudne o ile w ogóle możliwe i wyszłoby coś bardzo długiego i nieczytelnego. No bo na przykład jeśli przed @ mają być człony oddzielone kropką, z których każdy niepusty, to jak sprawdzić długość całego tekstu przed @? Najlepiej jeśli możesz zostawić takie uproszczone wyrażenie albo napisać to sprawdzenie w postaci normalnego kodu w języku programowania, a nie wyrażenia regularnego.

Offline Liosan

  • Redaktor

# Maj 06, 2012, 17:54:17
@Reg ale użycie 2-3 oddzielnych wyrażeń regularnych już byłoby całkiem wykonalne.

Liosan

Offline seti

  • Użytkownik

  • +1
# Maj 06, 2012, 21:01:02
Cześć,
nie wiem czy dla Perla będzie działać ale dla Javy wychodzi mi takie coś:
^[_A-Za-z0-9+-]+(\\.[_A-Za-z0-9+-]+)*@([A-Za-z0-9-])+(\\.[A-Za-z0-9-]+)*(\\.[a-z,A-Z]{1,5})$
Nie testowałem dokładnie ale powinno spełniać założenia oprócz:
-nazwy domen nie mogą zaczynać się oraz kończyć myślnikiem
-maksymalnej długości znaków

Dla sprawdzania maksymalnej ilości znaków najprościej byłoby użyć osobnego wyrażenia tak jak proponuje Liosan. Poniższe wyrażenie pisałem z głowy i nie sprawdzałem czy działa, ale wydaje mi się że mniej więcej tak to będzie szło:

^.{1,64}@.{1,253}$



Offline Hfaua

  • Użytkownik

  • +1
# Maj 06, 2012, 21:08:10
Wydaje mi się, że da się skonstruować pojedyncze wyrażenie, które dopasuje adres według podanych kryteriów.

Udało mi się stworzyć coś takiego:
(?=^.{1,256}$)(?=^.{1,64}@.{1,253})(?=^.*@.*\.[a-zA-Z]{1,5}$)^[a-zA-Z0-9_\+\-]+(\.[a-zA-Z0-9_\+\-]+)*@([a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9]|[a-zA-Z0-9])(\.([a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9]|[a-zA-Z0-9]))+$
Spieszę z tłumaczeniem:
1. Sprawdzamy długość całego stringu (max 256 znaków)
2. Sprawdzamy długość poszczególnych członów (user max 64, domain max 253)
3. Sprawdzamy ostatni człon domeny (max 5 znaków, wszystkie są literami)
4. Długości poszczególnych stringów są już sprawdzone - możemy zająć się dopasowaniem do wzorca z dopuszczalnymi znakami.
5. Dopasowujemy część "user" - musi ona mieć chociaż jeden człon składający się ze znaków [a-zA-Z0-9_+-]. Każdy kolejny człon, zaczynający się kropką jest opcjonalny (nie musimy sprawdzać długości - zostało to już zrobione wcześniej).
6. Część "user" się kończy - dopasowujemy znak "@"
7. Dopasowujemy część "domain" - musi ona mieć co najmniej dwa człony dwojakiej postaci:
   - [a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9] czyli najpierw znak alfanumeryczny bez minusa, następnie dowolna ilość znaków alfanumerycznych z minusem, a na końcu znak alfanumeryczny bez minusa
   - [a-zA-Z0-9] czyli pojedynczy znak alfanumeryczny, niebędący minusem

Wydaje mi się, że jest to poprawny regexp. Jeśli się pomyliłem, dajcie znać. Wydaje mi się, że można go trochę usprawnić, aby był czytelniejszy, ale spełnia swoją funkcję.

@OP: Składnia wyrażeń regularnych na prawdę nie jest trudna. Wystarczy chwilę przysiąść z jakimś interpreterem i metodą prób i błędów stworzyć wymagany wzorzec. Jedyną rzeczą, która jest mniej znana, a której użyłem, są nawiasy z pytajnikiem i znakiem równości. Możesz o tym poczytać choćby tutaj: http://stackoverflow.com/questions/469913/regular-expressions-is-there-an-and-operator

EDIT:
Interpreter regexp'a, z którego ja korzystałem, aby stworzyć powyższy wzorzec możesz znaleźć pod adresem: http://regexpal.com/
« Ostatnia zmiana: Maj 06, 2012, 21:14:15 wysłana przez Hfaua »

Offline Bloodian

  • Użytkownik

# Maj 06, 2012, 22:28:50
Genialne ! Dzieki, przeszlo.


Tym bardziej dziekuje za wytlumaczenie, sprobuje to jakos przenalizowac.

Jak juz mowilem, nie lubie jak ktos robi cos za mnie, ale zaoszczedziles mi wieeeeele czasu. Wracam do c++/javy bo mam juz dosyc tego romansu z perlem :)
Dzieki tez wszystkim za pomoc.
« Ostatnia zmiana: Maj 06, 2012, 22:33:12 wysłana przez Bloodian »

Offline Kos

  • Użytkownik
    • kos.gd


Offline ShadowDancer

  • Moderator

# Maj 17, 2012, 21:52:10
Kos: To na pewno fake, człowiek nie mógłby czegoś takiego napisać :)
« Ostatnia zmiana: Maj 17, 2012, 22:07:22 wysłana przez ShadowDancer »

Offline Kos

  • Użytkownik
    • kos.gd

# Maj 17, 2012, 22:44:37
A kto powiedział, że napisał to człowiek? More like- wygenerował :) teoria języków formalnych i maszyn stanów to nie jest przeca czarna magia.

Offline rm-f

  • Użytkownik
    • Tu trolluje

# Maj 18, 2012, 00:11:04
OMG, kiedyś chciałem napisać toola do regexpa opartego o generowanie kodu w czasie kompilacji. Chciałbym zobaczyć co by mi wygenerowalo się, szczególnie że miało być oparte o goto :D

Offline ShadowDancer

  • Moderator

# Maj 18, 2012, 00:59:04
Anyway wiem już o co chodzi z tym kotem na klawiaturze, z którego tak perlowcy żartują ;D