regular expression question

Συζητήσεις για γλώσσες προγραμματισμού και θέματα σχετικά με προγραμματισμό.
Post Reply
User avatar
silegav
Venus Project Founder
Venus Project Founder
Posts: 2098
Joined: Tue Mar 09, 2004 4:03 pm
Academic status: Alumnus/a
Location: The Center of the World -> Piraeus

regular expression question

Post by silegav » Mon Nov 13, 2006 12:11 pm

Παιδιά καλημέρα.
Έχω ένα προγραμματάκι σε JSP το οποίο παίρνει μια σελίδα html (σαν αρχείο το ανοίγει) και προσπαθεί να αφαιρέσει από μεσα του κάποια συγκεκριμένα πράγματα.
Αυτά που θέλω να φύγουν είναι τα παρακάτω

Code: Select all

<tr><td nowrap valign="top">(.*)<b>

Code: Select all

<td align="right" nowrap valign="top"><SPAN>(.*)</a>
Στην ουσία δεν θέλω να φύγουν, αλλά να αντικατασταθούν με κενό string.

Any ideas usefull. Έχω δοκιμάσει πάρα πολλά αλλά δεν γίνεται κάτι.
User avatar
giovanni
bit level
bit level
Posts: 32
Joined: Sat Sep 23, 2006 12:02 pm
Location: c:\hiberfil
Contact:

Post by giovanni » Tue Nov 14, 2006 12:11 am

Δοκίμασες το java.util.regex? Το είχα χρησιμοποιήσει σε κάποια εργασία, και έκανε τέλεια τη δουλεια. Δεν μπορείς να σκεφτείς την ίδια την expression, ή δεν ήξερες πώς γίνεται στη Java? (αν είναι το 2ο, προφανώς σου απάντησα ήδη ;) )

Αν είναι το 1ο, θα κοιτάξω αύριο να βρω την εργασία μου, γιατί βαριέμαι να ξαναεφεύρω τον τροχό :)
NIHIL AGENTI DIES LONGVS EST
User avatar
silegav
Venus Project Founder
Venus Project Founder
Posts: 2098
Joined: Tue Mar 09, 2004 4:03 pm
Academic status: Alumnus/a
Location: The Center of the World -> Piraeus

Post by silegav » Tue Nov 14, 2006 12:44 am

βασικά έχω χαθεί λίγο με την συγκεκριμένη library καθώς την κοιτάω και λίγο μπακάλικα.
Δεν την έχω πιάσει από την αρχή για να χτίσω πάνω σε αυτή, οπότε θα με βοηθούσε να μου έλεγες πως θα έφτιαχνες το Pattern για τα παραπάνω expressions.
User avatar
vangos
Mbyte level
Mbyte level
Posts: 571
Joined: Tue Mar 16, 2004 3:14 pm
Location: Heracleia@UTA

Post by vangos » Tue Nov 14, 2006 11:15 am

Code: Select all

Pattern pat = Pattern.compile("(<tr><td\\snowrap\\svalign=\"top\">)(.*)(<b>)", 
                    Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE | Pattern.DOTALL);
Matcher mat = pat.matcher(htmlCode);
if (mat.find()) {
    String entireExpresion = mat.group(0);
    String group1 = mat.group(1);
    String group2 = mat.group(2);
    String group3 = mat.group(3);
    ...
}
H mat.group(1) σου επιστρέφει ό,τι υπάρχει στο πρώτο ζευγάρι παρενθέσεων η mat.group(2) στο δεύτερο και πάει λέγοντας...
User avatar
silegav
Venus Project Founder
Venus Project Founder
Posts: 2098
Joined: Tue Mar 09, 2004 4:03 pm
Academic status: Alumnus/a
Location: The Center of the World -> Piraeus

Post by silegav » Tue Nov 14, 2006 5:04 pm

ευχαριστώ πολύ! Θα το δοκιμάσω!
User avatar
giovanni
bit level
bit level
Posts: 32
Joined: Sat Sep 23, 2006 12:02 pm
Location: c:\hiberfil
Contact:

Post by giovanni » Tue Nov 14, 2006 6:36 pm

Με προλάβανε :) Έτσι γίνεται όταν κάθομαι όλη μέρα στη σχολή αντί να κάνω κάτι καλύτερο...;(

Το μόνο που έχω να συμπληρώσω είναι η εναλλακτική λύση

Code: Select all

	public boolean setAFM(long afm)
	{
		if (!Pattern.matches("\\d{9}", String.valueOf(afm)))
		{
			System.err.println("Invalid AFM");
			return false;
		}
		
		AFM = afm;
		return true;
	}
Ο κώδικάς δεν έχει καμία σχέση με το πρόβλημα σου, όπως κατάλαβες, αλλά αν δεν χρειάζεσαι groups και είναι κάτι απλό, είναι η πιο straightforward λύση :)
NIHIL AGENTI DIES LONGVS EST
User avatar
silegav
Venus Project Founder
Venus Project Founder
Posts: 2098
Joined: Tue Mar 09, 2004 4:03 pm
Academic status: Alumnus/a
Location: The Center of the World -> Piraeus

Post by silegav » Wed Nov 15, 2006 12:22 am

δεν καταλαβαίνω καν τι κάνει ο κώδικας σου....τι είναι το \\d{9}?
User avatar
giovanni
bit level
bit level
Posts: 32
Joined: Sat Sep 23, 2006 12:02 pm
Location: c:\hiberfil
Contact:

Post by giovanni » Wed Nov 15, 2006 3:41 pm

Sorry, είπα αφού με είχαν προλάβει, να κάνω απλά ένα copy-paste και να μην μπω σε περισσότερες λεπτομέρειες.

Ο συγκεκριμένος κώδικας απλά ελέγχει αν το δοθέν ΑΦΜ είναι ΟΚ <=> έχει 9 ψηφία. Ιδού και το \d{9}. Βασικά μόνο η πρώτη γραμμή είναι που σε ενδιαφέρει, όπου στην matches() βάζεις σαν πρώτο όρισμα την regular expression και σα 2ο - το κείμενό σου.

Από 'κει κ πέρα το ίδιο το HTML εγώ θα το "έκοβα" σε tags είτε με Tokenizer (java.util.StringTokenizer), είτε με το χέρι, και θα το εξέταζα κάθε κομμάτι με την Pattern.matches...

Ελπίζω να ήμουν καλύτερος τώρα? :)
NIHIL AGENTI DIES LONGVS EST
User avatar
silegav
Venus Project Founder
Venus Project Founder
Posts: 2098
Joined: Tue Mar 09, 2004 4:03 pm
Academic status: Alumnus/a
Location: The Center of the World -> Piraeus

Post by silegav » Wed Nov 15, 2006 11:39 pm

Λίγο βαριά σαν λύση μου φαίνεται...το tokenization θα φάει πάρα πολύ χρόνο.
Το θέμα είναι να φτιάξω μια regex η οποία να τα κάνει όλα και γρήγορα!
Post Reply

Return to “Προγραμματισμός”