PDA

Visualizza la versione completa : [REGEXP] Match su numero di lettere maiuscole


ferris83
25-10-2005, 17:55
Ciao a tutti!
Io dovrei realizzare un'espressione regolare che data una stringa qualsiasi di caratteri alfanumerici "metchi" solo nel caso in cui il numero di lettere maiuscole presenti nella stringa non siano maggiori di x (con x a picere).
Qualcuno sa come potrei fare? Io nn so più dove sbattere la testa (è da pochissimo che ho iniziato a guardare le espressioni regolari...) :dhò:
Ringrazio anticipatamente quanti possano essermi d'aiuto...

Andrea1979
25-10-2005, 18:22
Manca la specifica del linguaggio... in javascript ad esempio questa:

re = /(([A-Z]+[^A-Z]*){6,}/;

fa il match (torna true) per qualunque stringa contenente 6 o più caratteri maiuscoli...

In javascript:
[xyz] rappresenta un set di caratteri: [A-Z] sono tutti i maiuscoli
[^xyz] è la negazione del set: [^A-Z] tutti i caratteri NON maiuscoli
+ = quello che precede viene trovato una o più volte
* = quello che precede viene trovato zero o più volte
{n,} = quello che precede viene trovato n o più volte

Traducila per il tuo linguaggio di programmazione.

ferris83
25-10-2005, 19:36
Ti ringrazio innanzitutto per la tua disponibilità.
Comunque io queste espressioni dovrò tradurle in java, tuttavia al momento le sto ancora studiando in chiave teorica (dato che non le avevo mai viste prima d'ora). Il mio problema è che le lettere maiuscole (cioè quelle lettere che non devono comparire più di un numero x prefissato) sono sparse in mezzo ad altre lettere che possono essere minuscole o numeri, e credo (in caso contrario ti prego di perdonare la mia ignoranza in materia) che tale problema rimanga anche col tuo esempio visto che nell'espressione /(([A-Z]+[^A-Z]*){6,}/ non mi sembra venga inserita la possibilità che ci possano essere minuscole o numeri appunto, tu che ne dici?

Andrea1979
25-10-2005, 19:47
[^A-Z] = nessuna lettera maiuscola, qualunque altro carattere ammesso. Già detto.



import java.util.regex.*;

public class regExp {

public regExp(String str, int repMax) {
Pattern p = Pattern.compile("([A-Z]+[^A-Z]*){"+(repMax+1)+",}");
Matcher m = p.matcher(str);
System.out.println(str+" match: "+m.matches());
}

public static void main (String[] args) {
regExp prova = new regExp("XPAre1@WQp",5);
regExp prova1 = new regExp("XPArW_sds_OPe1@WQp",5);
}
}

ferris83
26-10-2005, 09:09
Ho provato a scrivere l'espressione regolare che mi hai suggerito nel programma Teh regex coach (programma che data un'espressione regolare ti dice se la stringa che gli dai in input "metcha" oppure no) modificando l'intervallo da 0 a 6: ([A-Z]+[^A-Z]*){0,6}. Il problema è che "metchano" soltanto quelle stringhe che iniziano con lettere maiuscole (senza contare il fatto che anche se inserisco nella stringa un numero di lettere maiuscole superiore a 6 la stringa "mectha" lo stesso). Dove ho sbagliato?

Andrea1979
26-10-2005, 09:43
Ah, hai ragione sulla lettera maiuscola iniziale, così il problema dovrebbe essere risolto.



import java.util.regex.*;

public class regExp {

public regExp(String str, int repMax) {
Pattern p = Pattern.compile("[^A-Z]*([A-Z]+[^A-Z]*){"+(repMax+1)+",}");
Matcher m = p.matcher(str);
System.out.println(str+" match: "+m.matches());
}

public static void main (String[] args) {
regExp prova = new regExp("asdXPAre1@WQp",5);
regExp prova1 = new regExp("1aXPArW_sds_OPe1@WQp",5);
}
}


hai un match se si verifica la condizione espressa nella RegEXP, ossia se ammettiamo che a te interessino solo le stringhe contenenti al più 5 caratteri maiuscoli, vorrai scartare tutte le stringhe con 6 o più caratteri maiuscoli. Allora, devi trovare tutte le stringhe che contengono almeno 6 caratteri maiuscoli e scartarle. Il programmino lì sopra fa proprio quello, anche se puoi pure variare il numero massimo di caratteri maiuscoli che vuoi trovare: ti basta solo invertire il boolean (non l'ho fatto nel programma)

ferris83
26-10-2005, 10:36
Grazie mille finalmente ho risolto!!! :D
Comunque credo che purtroppo dovrò crearne ancora di espressioni regolari per sto progetto, al limite ti romperò ancora le scatole! :)
Intanto ti saluto e grazie infinite ancora! :ciauz:

ferris83
26-10-2005, 11:34
Mi è sorto un altro dubbio... :confused:
Avendo questa espressione regolare: [^A-Z]*([A-Z][^A-Z]*){2,5} (che accetta tutte le stringhe contenenti un numero di lettere maiuscole comprese tra 2 e 5), come si fa per aggiungere il vincolo di lunghezza minima della stringa totale? Mi spiego meglio, io vorrei mantenere il vincolo così com'è per quanto riguarda le lettere maiuscole ma vorrei definire anche quella che deve essere la lunghezza minima della stringa totale (per esempio: lettere maiuscole comprese tra 2 e 5 con lunghezza minima della stringa pari a 3)...??

Andrea1979
26-10-2005, 11:46
bhè, quello lo fai con length della stringa che passi al test. Non servono espressioni regolari

Nella tuo metodo di controllo di validità avrai un

if sulla lunghezza e annidato all'interno il match dell'espressione regolare. Se non passa l'if della lunghezza non serve controllare nemmeno l'espressione regolare.

ferris83
26-10-2005, 13:53
Sì hai ragione, era tanto per capire se era possibile incorporare il controllo sull'espressione regolare, ma va bene anche così... :)

Loading