Προς το περιεχόμενο

μεταγλωτιστες


christoszero

Προτεινόμενες αναρτήσεις

γεια σας ξερω πωσ μπορει να ΜΗΝ ΚΟΛΛΑΕΙ ΜΕ ΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΑΛΛΑ ΔΕΝ ΗΞΕΡΑ ΠΟΥ ΝΑ ΓΡΑΨΩ..ΒΑΣΙΚΑ ΣΠΟΥΔΑΖΩ ΠΛΗΡΟΦΟΡΙΚΗ ΚΑΙ ΜΑΣ ΕΧΟΥΝ ΒΑΛΕΙ ΜΙΑ ΕΡΓΑΣΙΑ ΣΤΟΥΣ ΜΕΤΑΓΛΩΤΙΣΤΕΣ .την εξης

 

 

Ένα περιορισµένο λειτουργικό σύστηµα έχει τους εξής κανόνες σύνταξης
ονοµάτων αρχείων και καταλόγων:  
Ένα όνοµα αποτελείται από τα πρώτα 5 κεφαλαία γράµµατα του λατινικού
αλφαβήτου, τα πρώτα 4 αριθµητικά ψηφία του δεκαδικού συστήµατος και
το _,  τα οποία µπορούν να επαναλαµβάνονται οσεσδήποτε φορές. Βασικό
στοιχείο του ονόµατος είναι ότι πρέπει να ξεκινά µε ένα από τα πρώτα 5 
κεφαλαία γράµµατα του λατινικού αλφαβήτου.  Το κάθε όνοµα µπορεί
επίσης να περιέχει και τον χαρακτήρα ‘$’ µέχρι µια φορά.   
(1) Να οριστεί η σύνταξη των ονοµάτων µε τους εξής τρόπους: 
(α) Ως κανονική έκφραση 
 
 
ΕΓΩ ΣΚΕΦΤΗΚΑ ΜΗΠΩΣ ΕΙΝΑΙ ΑΥΤΟ (Α|Β|C|D|E)(A|B|C|D|E|1|2|3|4|_)*($)? 
 
 
AΛΛΑ ΔΕΝ ΞΕΡΩ ΑΝ ΕΙΝΑΙ ΣΩΣΤΑ ΟΠΟΙΟΣ ΓΝΩΡΙΖΕΙ ΑΣ ΑΠΑΝΤΗΣΕΙ
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Περίπου. Κατ' αρχήν θα χρειαστεί να βάλεις το expression ανάμεσα στα anchors ^ και $ για να μην δέχεται ως σωστά ονόματα που ένα μέρος τους ικανοποιεί τα κριτήρια.

 

Το βασικό θέμα όμως είναι το πώς να υλοποιήσεις το "μέχρι μία φορά". Μπορείς να το υλοποιήσεις ως "προαιρετικά επιτρεπόμενοι χαρακτήρες, μετά προαιρετικά ένα $, μετά προαιρετικά άλλοι επιτρεπόμενοι χαρακτήρες", το οποίο φαντάζομαι είναι αυτό που περιμένει και ο καθηγητής σας σα λύση:

 

^[A-E][A-E1-4_]*\$?[A-E1-4_]*$

 

Επίσης όμως μπορείς να το κάνεις και με negative lookahead:

 

^[A-E](?!.*?\$.*?\$)[A-E1-4$_]*$

 

Το τελευταίο μέρος του expression κάνει match όσα δολάρια θέλεις, οπότε για να γυρίσουμε πίσω στο "μέχρι ένα μόνο" χρησιμοποιώ το negative lookahead (?!.*?\$.*?\$) το οποίο σημαίνει "κάνε match μόνο αν από το σημείο αυτό και μετά το pattern μετά το ?! δεν μπορεί να κάνει match". Δηλαδή το expression σα σύνολο λειτουργεί ως

  • Σιγουρέψου ότι ξεκινάς με ένα γράμμα Α-Ε
  • Σιγουρέψου ότι στη συνέχεια και μέχρι το τέλος της εισόδου δεν υπάρχουν 2 τουλάχιστον δολάρια
  • Σιγουρέψου ότι συνεχίζεις με οποιοδήποτε αριθμό από τους επιτρεπτούς χαρακτήρες

 

Το πλεονέκτημα της δεύτερης μεθόδου είναι πως αν έχεις ένα γενικό κανόνα με κάποιους μικρούς περιορισμούς, μπορείς να τη χρησιμοποιήσεις για να εισάγεις εύκολα όσους περιορισμούς θέλεις χωρίς να σου πέσουν τα μαλλιά και χωρίς να χρειάζεται να επαναλάβεις τον γενικό κανόνα. Στην προκειμένη και ο περιορισμός και το αποδεκτό είναι πολύ απλά expressions οπότε δε φαίνεται, αλλά φαντάσου (ή δοκίμασε) τι θα γινόταν αν

  • αντί για [A-E1-4_]* είχες δυο γραμμές expression που έπρεπε να επαναληφθεί όπως γίνεται στην πρώτη μορφή (και μετά σκέψου τι μπορεί να γινόταν αν χρειαζόταν να κάνεις κάποια αλλαγή εκει μέσα)
  • ο περιορισμός ήταν "μέχρι ένα δολάριο και μέχρι δύο θαυμαστικά, αλλά τα δολάρια και τα θαυμαστικά να μην είναι πάνω από 2 συνολικά" (με τη δεύτερη μέθοδο είναι "απλό", με την πρώτη εφιάλτης)

 

Read the manual για περισσότερες λεπτομέρειες, και αν δεν το ξέρεις ήδη χρησιμοποίησε το refiddle.com για πειράματα και δημοσίευση των προσπαθειών σου.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

ΕΥΧΑΡΙΣΤΩ ΓΙΑ ΤΗΝ ΑΠΑΝΤΗΣΗ ΑΝ ΚΑΙ ΕΧς ΜΕΡΙΚΕΣ ΑΠΟΡΙΕΣ .ΚΑΙ ΤΑ ΔΥΟ ΠΟΥ ΜΟΥ ΕΙΝΑΙ ΕΙΝΑΙ ΣΩΣΤΑ ΕΤΣΙ?ΔΕΝ ΚΑΤΑΛΑΒΑ ΚΑΙ ΠΟΛΥ ΤΗΝ ΔΕΥΤΕΡΗ ΜΕΘΟΔΟ ΚΑΙ ΕΠΙΠΛΕΟΝ ΕΙΝΑΙ ΕΠΕΙΔΗ Η ΕΡΓΑΣΙΑ ΣΥΝΕΧΙΖΕΙ ΒΑΣΗ ΤΗΣ ΕΚΦΡΑΣΗΣ ΘΑ ΓΡΑΨΩ ΤΟ ΠΡΩΤΟ ΠΟΥ ΜΟΥ ΦΑΙΝΕΤΑΙ ΠΙΟ ΕΥΚΟΛΟ.ΤΕΛΟΣ ΔΕΝ ΕΧΩ ΚΑΤΑΛΑΒΕΙ ΑΝ ΤΟΝ ΟΡΙΖΕΙΣ ΩΣ ΚΑΝΟΝΙΚΗ ΕΚΦΡΑΣΗ ?ΑΠΟ ΟΤΙ ΚΑΤΑΛΑΒΑ ΕΓΩ ΤΟ ΣΩΣΤΟ ΕΙΝΑΙ ΑΥΤΟ    (Α|Β|C|D|E)(A|B|C|D|E|1|2|3|4|_)*($)?(A|B|C|D|E|1|2|3|4|_)*($)?



Η ΜΗΠΩΣ ΑΥΤΟ   (Α|Β|C|D|E)(A|B|C|D|E|1|2|3|4|_)*($)?(A|B|C|D|E|1|2|3|4|_)*

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Εισαι πολυ κοντα.

 

Το ? σημαινει μια ή καμία φορά. Δεν χρειαζεται να βαλεις () στο $.Το ? "κολλαει" με ενα χαρακτηρα ετσι κι αλλιως.

 

Από την άλλη μπορεις να κάνεις ντεντερμινιστικο αυτόματο και να βγάλεις πιο εύκολα την κανονική έκφραση

 

Δες το και σαν επαληθευση :)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Διάβασε πρώτα τα απολύτως βασικά για τη σύνταξη των regular expressions και στη συνέχεια εδώ είμαστε. Κάποια πράγματα όπως τη διαφορά ανάμεσα στο $ και στο \$ δεν γίνεται να τα εξηγούμε ένα ένα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

τεσπα δεν φταιω εγω παιδια στο παπει πληροφορικη σπουδαζω και το βιβλιο δεν κανει μεγαλη αναλυση για κανονικες εκφρασεις ..

συμφωνα με το σιτε που μου εστειλες παντος defacer ^[A-E][A-E1-4_]*\$?[A-E1-4_]* AYTO EINAI TO ΠΙΟ ΣΩΣΤΟ .ΑΜΑ ΔΙΑΦΩΝΕΙΤΕ Η ΕΙΣΤΕ ΣΙΓΟΥΡΟΙ ΓΙΑ ΑΛΛΗ ΑΠΑΝΤΗΣΗ ΠΕΙΤΕ

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Με RegEx δεν ασχολούμαι ιδιαίτερα, όταν κάποια στιγμή χρειάσθηκε να σχεδιάσω και να δοκιμάσω (για ένα λογισμικό μου) μερικές εκφράσεις διευκολύνθηκα αρκετά με τούτο εδώ το πρόγραμμα (Expresso) το οποίο είναι freeware (αν και μετά από 30 ημέρες απαιτεί registration δίχως χρέωση).

Ενδεχομένως να σου φανεί χρήσιμο λοιπόν.

 

Καλή συνέχεια!!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

ΤΗΝ ΕΒΓΑΛΑ ΤΕΛΙΚΑ ΤΗΝ ΕΚΦΡΑΣΗ (Α|Β|C|D|E)(A|B|C|D|E|1|2|3|4|_)*($)?(A|B|C|D|E|1|2|3|4|_)*  ΑΥΤΗ ΠΙΣΤΕΥΩ ΠΩΣ ΕΙΝΑΙ.

Ο ΟΡΙΣΜΟΣ ΣΕ ΒΝF ΕΙΝΑΙ ΑΥΤΟΣ ΤΕΛΕΥΤΑΙΑ ΕΡΩΤΗΣΗ ΠΟΥ ΚΑΝΩ  ;P

 

 

<S> ::= <Letter> | <Expression>
<Expression> ::= <Letter><Expression> |
<Digit><Expression>|'_'|$ <Expression1 >
 
 
<Expression1>::= <Letter><Expression1>|
<Digit><Expression1>|Null
<Letter > : = A | B | C | D | E
<Digit> := 1 | 2 | 3 | 4
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...