Info regex java

di il
17 risposte

Info regex java

Salve ho fatto questo codice. ora mi è stato chiesto di fare una regex che quando inserisco i dati del medico se metto un nome seguido da numeri tipo modico22 mi da errore, come posso fare??

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
AziendaSanitaria as = new AziendaSanitaria();
System.out.println("Inserisci il medico dell'azienda sanitaria: ");
String nominativo = sc.nextLine();
while(!nominativo.equalsIgnoreCase("-0")) {
if(as.aggiungiMedico(new Medico(nominativo))) {
System.out.println("Inserimento riuscito\n");
}else
System.out.println("Inserimento errato\n");

System.out.println("Inserisci il medico da inserire: ");
System.out.println("(-0) per terminare");
nominativo = sc.nextLine();
}

}
}

17 Risposte

  • Re: Info regex java

    SuperKay ha scritto:


    mi è stato chiesto di fare una regex che quando inserisco i dati del medico se metto un nome seguido da numeri tipo modico22 mi da errore, come posso fare??
    Puoi o fare una regex (da usare con il find() di Matcher) per cercare solo se ci sono cifre numeriche oppure in modo più completo puoi validare l'intero input (con matches() di Matcher o direttamente il matches(String regex) di String). A tua scelta o secondo requisiti.
  • Re: Info regex java

    andbin ha scritto:


    SuperKay ha scritto:


    mi è stato chiesto di fare una regex che quando inserisco i dati del medico se metto un nome seguido da numeri tipo modico22 mi da errore, come posso fare??
    Puoi o fare una regex (da usare con il find() di Matcher) per cercare solo se ci sono cifre numeriche oppure in modo più completo puoi validare l'intero input (con matches() di Matcher o direttamente il matches(String regex) di String). A tua scelta o secondo requisiti.
    ho provato cosi ma non gira.
    while(!nominativo.equalsIgnoreCase("-0") || nominativo.matches("[0-9"))
  • Re: Info regex java

    SuperKay ha scritto:


    ho provato cosi ma non gira.
    while(!nominativo.equalsIgnoreCase("-0") || nominativo.matches("[0-9"))
    Non "gira" proprio innanzitutto perché hai dimenticato la ] che racchiude la "classe di caratteri". Ma se anche avessi scritto matches("[0-9]") non servirebbe comunque. Perché verificherebbe che TUTTA la stringa corrisponda esattamente a una sola cifra decimale. Non ha senso così.

    Se vuoi usare matches per validare l'intera stringa, si deve ragionare così: quale è la forma generalizzata della stringa corretta e valida? Nel tuo caso potrebbe essere, detto a parole: "uno o più caratteri alfabetici".

    Bene, guarda nel javadoc di Pattern come si dice "un carattere alfabetico" e poi metti il quantificatore "uno o più".
  • Re: Info regex java

    Ho controllato come mi hai detto, ho visto che il comando è [a-zA-Z]. ma non so proprio come metterlo nel mio codice
  • Re: Info regex java

    SuperKay ha scritto:


    Ho controllato come mi hai detto, ho visto che il comando è [a-zA-Z].
    Sì, questo è giusto se bastano solo le lettere ASCII (escludendo quindi tutte le lettere speciali delle varie lingue es. è ù å ñ ecc...).

    Ma lo ribadisco: serve anche un "quantificatore". Solo nominativo.matches("[a-zA-Z]") dice solamente "un (1!!) carattere alfabetico". Visto che si vuole "uno o più", devi aggiungere dietro il quantificatore appropriato.

    SuperKay ha scritto:


    ma non so proprio come metterlo nel mio codice
    Come ho appena detto sopra.
  • Re: Info regex java

    Ci rinuncio non riesco proprio a capire
  • Re: Info regex java

    SuperKay ha scritto:


    Ci rinuncio non riesco proprio a capire
    Scusa ma non riesci a capire che cosa?

    Un codice es.

    if (nominativo.matches("[a-zA-Z]")) { .... }

    Verifica solo che nominativo contenga UN solo singolo carattere a-z o A-Z. Non "uno o più" di questi. Per esprimere "uno o più" oppure "zero o più" oppure "zero o uno" (o in generale n) ci vogliono i "quantificatori". Sono elencati nel javadoc di Pattern sotto le voci "quantifiers". E ce ne sono di 3 tipi: Greedy / Reluctant / Possessive. Non sto ora a spiegarti le differenze. A te basta uno di quelli "greedy".
  • Re: Info regex java

    Grazie dell'aiuto, ma non ci riesco proprio
  • Re: Info regex java

    SuperKay ha scritto:


    Grazie dell'aiuto, ma non ci riesco proprio
    Capisco .... ma sarebbe una buona cosa se provassi a pensarci impegnandoti un pochino. Continuare a dire "non ci riesco" (senza peraltro specificare in COSA non riesci) non è molto utile, per te dico.

    Ti ho già detto che fare:

    if (nominativo.matches("[a-zA-Z]"))

    È corretto ma può corrispondere ad 1 sola lettera alfabetica. Non c'è nulla lì che dica "una o più lettere". Se vuoi definire quante lettere vuoi accettare, devi usare i "quantificatori".

    La documentazione di Pattern ad un certo punto elenca i "Greedy quantifiers". A te serve quello "one or more times" (in quella documentazione la lettera "X" indica un qualunque costrutto, come è ad esempio proprio la "classe di caratteri" usata sopra).
  • Re: Info regex java

    Avevo provato una cosa simile
    String s = "[a-z]";
    Pattern p = Pattern.compile("x+");
    Matcher m = p.matcher(s);

    e avevo inserito m nel while ma nulla non va
  • Re: Info regex java

    SuperKay ha scritto:


    String s = "[a-z]";
    Pattern p = Pattern.compile("x+");
    Matcher m = p.matcher(s);

    e avevo inserito m nel while ma nulla non va
    No alt, sei completamente fuori strada. Innanzitutto "[a-z]" è la espressione regolare, non il testo da matchare! (l'hai passato a matcher() !)
    E poi lo ripeto, nella documentazione di Pattern la X che si ripete più volte è il modo generico per indicare un qualunque costrutto. Una singola lettera è un costrutto, una "classe di caratteri" è un singolo costrutto, ecc...

    Quindi ad esempio

    if (nominativo.matches("[xyz]+"))

    allora corrisponde a un nominativo che contiene es. "xxx" o "xyyz" o "zzzyyx" ma non "" o "XX" o "xaz".

    Quel "+" descrive semplicemente: uno o più del precedente costrutto
  • Re: Info regex java

    Ottimo sono andato in tilt e ancora non ho capito una fava
  • Re: Info regex java

    SuperKay ha scritto:


    Ottimo sono andato in tilt e ancora non ho capito una fava
    Allora, una espressione es. [0-9]+

    [0-9] = costrutto che dice "una qualunque cifra numerica 0...9"

    + = "uno o più" del precedente costrutto

    Quindi può corrispondere a stringhe del tipo "02245" o "8" o "334562" ma non "99a2" o "a123"

    Cosa c'è di non chiaro?
  • Re: Info regex java

    Grazie ora ho capito il codice funziona. un ultima domanda cè un epressione per bloccare i caratteri alfanumerici? grazie
Devi accedere o registrarti per scrivere nel forum
17 risposte