Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [Java] Problema con le REGEX

    Ciao,
    Sto facendo un programma in cui mi serve anche validare un indirizzo e-mail. Ho un piccolo problema nel comporre la REGEX dello user-id.
    I criteri per parsarlo (non ho seguito per filo e per segno l'RFC) sono i seguenti:
    1. Non deve iniziare e terminare con "." ....[OK]
    2. Può contenere caratteri ASCII ....[OK]
    3. Lunghezza compresa tra i 4 e 64 caratteri....[OK]
    4. Non deve contenere più punti consecutivi....[KO]
    5. non deve contenere spazi o tab....[KO]

    Quindi la REGEX assume questa forma(delimitatori inizio e fine riga li aggiungo poi):
    "([\\p{ASCII}&&[^\\.]][\\p{ASCII}]*[\\p{ASCII}&&[^\\.]]){3,63}"

    Il mio problema nasce quando cerco di aggiungere i vincoli che non debba contenere uno o più spazi/tab e 2 o più punti consecutivi. (es. "nome<spazio>cognome@dominio.it" o "nome..cognome@dominio.it").

    Ho provato con: "([\\p{ASCII}&&[^\\.]][\\p{ASCII}&&[^(\\.\\.)+] ]*[\\p{ASCII}&&[^\\.]]){3,63}" ed una cosa simile per gli spazi ma si comporta in modo strano, tipo che mi funziona solo con un numero pari di occorrenze e così via.
    Provato anche con: &&[^\\.]{2,}, ma nulla.

    qualcuno saprebbe darmi un suggerimento?

    P.S.:So che esistono javamail o altre librerie, ma il mio scopo è familiarizzare con le regular expression.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Java] Problema con le REGEX

    Originariamente inviato da zamabonza
    qualcuno saprebbe darmi un suggerimento?
    Sì e per darti un suggerimento ti faccio un esempio più semplice (altrimenti complicherei troppo).

    Una stringa deve contenere solo caratteri a...z (solo lettere minuscole) e il . (punto). Ma con le seguenti restrizioni:
    - Il punto non può stare a inizio o fine.
    - Il punto non può essere ripetuto due o più volte consecutivamente.

    La regex è la seguente:

    String regex = "[a-z](?:[a-z]|(?<!\\.)\\.)*[a-z]";

    La spiegazione è abbastanza semplice:

    a) Inizia con [a-z] in pratica solo una lettera minuscola

    b) La parte (?:[a-z]|(?<!\\.)\\.)* va decomposta nel seguente modo.

    Innanzitutto (?:X) denota un gruppo X ma non "catturante" (visto che in questo caso non serve catturare solo quella parte).
    Mentre invece (?<!X) è un "zero-width negative lookbehind" e si limita solo a guardare indietro che non (negativo appunto) ci sia X.

    Quindi è un gruppo non catturante che può avere:
    - Una lettera
    oppure
    - Un punto, purché indietro non ci sia un altro punto

    Tutto il gruppo ripetuto 0 o più volte grazie al *

    c) La parte finale [a-z] è come la parte iniziale.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Perfetto, lo applico subito, non mi erano chiari gli operatori catturanti e non. Senza queste nozioni penso che sarebbe stato un bel casino se non impossibile. Grazie mille.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.