Θετική και αρνητική προοπτική στις κανονικές εκφράσεις της JavaScript

Μερικές φορές χρειάζεται να λύσουμε ένα πρόβλημα του τύπου: βρες τη συμβολοσειρά 'aaa' και αντικατέστησέ την με '!', αλλά μόνο αν μετά την 'aaa' υπάρχει 'x', ενώ το ίδιο το 'x' να μην αντικατασταθεί. Αν προσπαθήσουμε να λύσουμε το πρόβλημα 'κατευθείαν', δεν θα τα καταφέρουμε:

javascript'aaax baaa'.replace(/aaax/g, '!'); // επιστρέφει '! baaa', αλλά θέλαμε '!x baaa'

Προοπτική προς τα εμπρός

Για να λυθεί το πρόβλημα χρειάζεται ένας τρόπος να πούμε ότι το 'x' δεν πρέπει να αντικατασταθεί. Αυτό γίνεται με τη βοήθεια ειδικών παρενθέσεων (?= ), που απλά κοιτούν, αλλά δεν «παίρνουν» μαζί τους.

Αυτές οι παρενθέσεις ονομάζονται θετική προοπτική προς τα εμπρός. Θετική - γιατί το 'x' (στην περίπτωσή μας) πρέπει να υπάρχει - μόνο τότε θα πραγματοποιηθεί η αντικατάσταση.

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

javascript'aaax aaab'.replace(/aaa(?=x)/g, '!'); // επιστρέφει '!x aaab'

Υπάρχει και η αρνητική προοπτική προς τα εμπρός - (?! ) - η οποία, αντίθετα, λέει ότι κάτι δεν πρέπει να υπάρχει. Στο επόμενο παράδειγμα, η αντικατάσταση θα πραγματοποιηθεί μόνο αν μετά την 'aaa' δεν υπάρχει 'x':

javascript'aaax aaab'.replace(/aaa(?!x)/g, '!'); // επιστρέφει 'aaax !b'

Προοπτική προς τα πίσω

Παρομοίως, υπάρχει θετική προοπτική προς τα πίσω - (?<= ). Στο επόμενο παράδειγμα, η αντικατάσταση θα πραγματοποιηθεί μόνο αν πριν από την 'aaa' υπάρχει 'x':

javascript'xaaa'.replace(/(?<=x)aaa/g, '!'); // επιστρέφει 'x!'

Και υπάρχει επίσης αρνητική προοπτική προς τα πίσω - (?<! ). Στο επόμενο παράδειγμα, η αντικατάσταση θα πραγματοποιηθεί μόνο αν πριν από την 'aaa' δεν υπάρχει 'x':

javascript'baaa'.replace(/(?<!x)aaa/g, '!'); // επιστρέφει 'b!'

Πρακτικά προβλήματα

Задание 1

Δίνεται μια συμβολοσειρά που περιέχει ονόματα συναρτήσεων:

javascriptlet str = 'func1() func2() func3()';

Λάβετε έναν πίνακα με τα ονόματα των συναρτήσεων από τη συμβολοσειρά.

Задание 2

Δίνεται μια συμβολοσειρά με μια ετικέτα:

javascriptlet str = '<a href="" class="eee" id="zzz">';

Λάβετε έναν πίνακα με τα ονόματα των χαρακτηριστικών αυτής της ετικέτας.

Задание 3

Δίνεται μια συμβολοσειρά με μεταβλητές:

javascriptlet str = '$aaa $bbb $ccc xxxx';

Λάβετε τις υποσυμβολοσειρές που προηγείται ο χαρακτήρας του δολαρίου.