τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Σε κανονικές εκφράσεις,; Μπορεί να αντιπροσωπεύει ποσότητα, 0 ή 1 φορές, που ισοδυναμεί με {0, 1} ή μπορεί να χρησιμοποιηθεί ως ειδικός χαρακτήρας για να αναπαραστήσει άλλες έννοιες.
Το ? ακολουθούμενο από άλλα κριτήρια ποσότητας υποδηλώνει μη άπληστη αντιστοίχιση, δηλαδή αντιστοίχιση με τη συντομότερη δυνατή συμβολοσειρά που αναζητείται.
Ας δούμε ένα παράδειγμα:
- @Test
- public void test() {
- Pattern pattern = Pattern.compile("a.*?");
- Matcher matcher = pattern.matcher("abcabc");
- if (matcher.matches()) {
- System.out.println(matcher.group());
- }
- }
Έξοδος μετά την εκτέλεση: abcabc
Δεν είναι το πιο σύντομο ταίρι; Γιατί απέτυχε;
Αυτό στην πραγματικότητα περιλαμβάνει τους κανόνες της μη άπληστης αντιστοίχισης:Για μη άπληστη αντιστοίχιση, η συντομότερη διαδρομή αντιστοιχίζεται πριν από τον επόμενο κανόνα.
Δηλαδή, αν εμφανιστεί μόνο το "a.*?"
Ας δούμε τη σωστή χρήση:
- @Test
- public void test() {
- Pattern pattern = Pattern.compile("(a.*?)(.*)");
- Matcher matcher = pattern.matcher("afcafc");
- if (matcher.matches()) {
- System.out.println(matcher.group(0));
- System.out.println(matcher.group(1));
- System.out.println(matcher.group(2));
- }
- }
Έξοδος μετά την εκτέλεση:
- afcafc
- a
- fcafc
Όπως μπορείτε να δείτε, η πρώτη ομάδα λήψης συλλαμβάνει τη συντομότερη συμβολοσειρά "a" και η δεύτερη ομάδα λήψης καταγράφει "fcafc".
Ας ρίξουμε μια ματιά στις άλλες δύο καταστάσεις:
Όταν χρησιμοποιείται σε μια ομάδα λήψης, το ?: τοποθετείται πριν από την κανονική έκφραση για να υποδείξει την αντιστοίχιση αλλά όχι τη σύλληψη, δηλαδή, αυτή η ομάδα τιμών αντιστοίχισης δεν μπορεί να ληφθεί μέσω της μεθόδου ομάδας.
Ας δούμε ένα παράδειγμα
- @Test
- public void test0() {
- Pattern pattern = Pattern.compile("\d{4}-(?:[a-z]+)");
- Matcher matcher = pattern.matcher("3214-opo");
- if (matcher.matches()) {
- System.out.println(matcher.group());
- System.out.println(matcher.group(1)); // 报错
- }
- }
Θα αναφερθεί ένα σφάλμα κατά τη λήψη μέσω της ομάδας(1), δηλαδή, μπορεί να αντιστοιχιστεί αλλά δεν μπορεί να καταγραφεί. Εάν το ?: αφαιρεθεί, μπορεί να αποτυπωθεί κανονικά μέσω της ομάδας(1).
Το (?s) ενεργοποιεί τη λειτουργία μονής γραμμής στη δεξιά πλευρά, κάνοντας το να ταιριάζει με οποιονδήποτε χαρακτήρα, συμπεριλαμβανομένου του χαρακτήρα n νέας γραμμής.
Ας δούμε ένα παράδειγμα:
- private static final String DEFAULT_VARIABLE_PATTERN = "((?s).*)";
-
-
- /**
- * 从输出结果可知,匹配到了换行符 'n'
- */
- @Test
- public void test4() {
- Pattern pattern = Pattern.compile(DEFAULT_VARIABLE_PATTERN);
- Matcher matcher = pattern.matcher("abcnsdf");
- if (matcher.matches()) {
- System.out.println(matcher.group());
- System.out.println(matcher.group(1));
- System.out.println(matcher.group(2)); // (?s) 不能作为捕获组,报错
- }
- }
Κατά τη λήψη, το (?s) δεν μπορεί να καταγραφεί ως ομάδα λήψης, επομένως το "((?s).*)" μπορεί να καταγράψει την ομάδα(1) το πολύ, και θα αναφερθεί ένα σφάλμα κατά τη λήψη της ομάδας(2).
- @Test
- public void test5() {
- Pattern pattern = Pattern.compile("(.*)");
- Matcher matcher = pattern.matcher("abcnsdf");
- if (matcher.matches()) {
- System.out.println(matcher.group());
- System.out.println(matcher.group(1));
- }
- }
Αφού αφαιρέσετε το (?s), προσπαθήστε να ταιριάξετε το "abcnsdf" Επειδή υπάρχει ένας χαρακτήρας νέας γραμμής, η αντιστοίχιση δεν μπορεί να ολοκληρωθεί, επομένως δεν θα βγει τίποτα.