Swift Academy · Lezione

Gruppi di cattura

Estrai sottostringhe dai risultati.

Lezione 2 di 413 passaggi

Gruppi di cattura è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Swift Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Swift Academy include 4 lezioni in totale.

Gruppi di cattura

Le parentesi in una regex creano gruppi di cattura. Ogni gruppo conserva la sottostringa a cui ha corrisposto, così è possibile estrarre parti strutturate da una corrispondenza più ampia.

Una singola cattura

Racchiudendo una parte del pattern in () la si cattura. L'output della corrispondenza diventa una tupla: prima la corrispondenza completa, poi ogni cattura.

if let m = "v2".firstMatch(of: /v(\d+)/) {
    print("Whole: \(m.0)")
    print("Group: \(m.1)")
}

Più catture

Ogni coppia di parentesi aggiunge un altro elemento alla tupla di output, nell'ordine da sinistra a destra.

if let m = "2024-05-30".wholeMatch(of: /(\d{4})-(\d{2})-(\d{2})/) {
    print("Year: \(m.1)")
    print("Month: \(m.2)")
    print("Day: \(m.3)")
}

La corrispondenza completa è .0

L'elemento .0 dell'output è sempre l'intero testo corrispondente. Le catture iniziano da .1.

if let m = "key=value".wholeMatch(of: /(\w+)=(\w+)/) {
    print("Full: \(m.0)")
    print("Key: \(m.1), Value: \(m.2)")
}

Le catture sono sottostringhe

Per impostazione predefinita, le catture sono valori Substring che fanno riferimento alla stringa originale. Le converta con String(...) se deve conservarle.

if let m = "abc123".firstMatch(of: /([a-z]+)(\d+)/) {
    let letters = String(m.1)
    let numbers = String(m.2)
    print(letters, numbers)
}

Catture opzionali

Se un gruppo è opzionale (seguito da ?), la relativa cattura può essere nil quando il gruppo non ha partecipato alla corrispondenza.

if let m = "color".wholeMatch(of: /colou?(r)/) {
    print("Captured: \(m.1)")
}

Catture con nome

È possibile assegnare un nome a un gruppo con (?<name>...) e leggerlo tramite l'output denominato, che è più chiaro degli indici numerici.

let re = /(?<area>\d{3})-(?<line>\d{4})/
if let m = "555-1234".wholeMatch(of: re) {
    print("Area: \(m.area)")
    print("Line: \(m.line)")
}

Iterare sulle catture

Combini le catture con matches(of:) per estrarre dati strutturati da molte corrispondenze contemporaneamente.

let log = "a=1 b=2 c=3"
for m in log.matches(of: /(\w+)=(\d+)/) {
    print("\(m.1) -> \(m.2)")
}

Gruppi annidati

I gruppi possono essere annidati. Il gruppo esterno cattura l'intera corrispondenza, mentre i gruppi interni ne catturano le parti. La numerazione segue l'ordine delle parentesi aperte.

if let m = "12:30".wholeMatch(of: /((\d+):(\d+))/) {
    print("All: \(m.1)")
    print("H: \(m.2), M: \(m.3)")
}

Gruppi non catturanti

Usi (?:...) per raggruppare senza catturare, quando le serve il raggruppamento per un quantificatore ma non vuole un elemento aggiuntivo nella tupla.

if let m = "abab".wholeMatch(of: /(?:ab)+/) {
    print("Matched: \(m.0)")
}

Costruire un parser

Le catture trasformano il testo non elaborato in valori tipizzati. Qui analizziamo una stringa di coordinate e la convertiamo in numeri interi.

func parsePoint(_ s: String) -> (Int, Int)? {
    guard let m = s.wholeMatch(of: /(\d+),(\d+)/),
          let x = Int(m.1), let y = Int(m.2) else { return nil }
    return (x, y)
}
print(parsePoint("3,7") ?? "nil")

Verifica rapida

Per il pattern /(\d{4})-(\d{2})/ che corrisponde a "2024-05", qual è m.2?

Riepilogo

Le parentesi creano gruppi di cattura accessibili come una tupla, dove .0 è la corrispondenza completa e .1, .2... sono le catture. Ha visto gruppi denominati, opzionali, annidati e non catturanti. Successivamente costruirà regex a partire da codice Swift leggibile con RegexBuilder.

Gratis per iniziare

Impara Swift con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
122
Lezioni
409

Domande Frequenti

La lezione «Gruppi di cattura» è gratuita?

Sì — il testo completo di «Gruppi di cattura» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Swift Academy, passa a CoddyKit PRO. Il corso Swift Academy include 4 lezioni in totale.

Cosa imparerò in «Gruppi di cattura»?

Estrai sottostringhe dai risultati. Eserciti Swift Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Swift Academy?

Non è richiesta alcuna esperienza precedente. Swift Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Gruppi di cattura»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Swift Academy?

Sì. Ogni lezione Swift Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Letterali regex e pattern matching
  2. Gruppi di cattura
  3. DSL RegexBuilder
  4. Sostituzione e suddivisione del testo
← Torna a Swift Academy