Page 1 of 1

regular expression question

Posted: Mon Nov 13, 2006 12:11 pm
by silegav
Παιδιά καλημέρα.
Έχω ένα προγραμματάκι σε 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. Έχω δοκιμάσει πάρα πολλά αλλά δεν γίνεται κάτι.

Posted: Tue Nov 14, 2006 12:11 am
by giovanni
Δοκίμασες το java.util.regex? Το είχα χρησιμοποιήσει σε κάποια εργασία, και έκανε τέλεια τη δουλεια. Δεν μπορείς να σκεφτείς την ίδια την expression, ή δεν ήξερες πώς γίνεται στη Java? (αν είναι το 2ο, προφανώς σου απάντησα ήδη ;) )

Αν είναι το 1ο, θα κοιτάξω αύριο να βρω την εργασία μου, γιατί βαριέμαι να ξαναεφεύρω τον τροχό :)

Posted: Tue Nov 14, 2006 12:44 am
by silegav
βασικά έχω χαθεί λίγο με την συγκεκριμένη library καθώς την κοιτάω και λίγο μπακάλικα.
Δεν την έχω πιάσει από την αρχή για να χτίσω πάνω σε αυτή, οπότε θα με βοηθούσε να μου έλεγες πως θα έφτιαχνες το Pattern για τα παραπάνω expressions.

Posted: Tue Nov 14, 2006 11:15 am
by vangos

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) στο δεύτερο και πάει λέγοντας...

Posted: Tue Nov 14, 2006 5:04 pm
by silegav
ευχαριστώ πολύ! Θα το δοκιμάσω!

Posted: Tue Nov 14, 2006 6:36 pm
by giovanni
Με προλάβανε :) Έτσι γίνεται όταν κάθομαι όλη μέρα στη σχολή αντί να κάνω κάτι καλύτερο...;(

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

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 λύση :)

Posted: Wed Nov 15, 2006 12:22 am
by silegav
δεν καταλαβαίνω καν τι κάνει ο κώδικας σου....τι είναι το \\d{9}?

Posted: Wed Nov 15, 2006 3:41 pm
by giovanni
Sorry, είπα αφού με είχαν προλάβει, να κάνω απλά ένα copy-paste και να μην μπω σε περισσότερες λεπτομέρειες.

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

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

Ελπίζω να ήμουν καλύτερος τώρα? :)

Posted: Wed Nov 15, 2006 11:39 pm
by silegav
Λίγο βαριά σαν λύση μου φαίνεται...το tokenization θα φάει πάρα πολύ χρόνο.
Το θέμα είναι να φτιάξω μια regex η οποία να τα κάνει όλα και γρήγορα!