Bisogno di assistenza con le espressioni regolari in Qt (QRegExp) [sintassi ripetizione male?]

StackOverflow https://stackoverflow.com/questions/4507224

  •  12-10-2019
  •  | 
  •  

Domanda

void MainWindow::whatever(){
    QRegExp rx ("<span(.*?)>");
    //QString line = ui->txtNet1->toHtml();
    QString line = "<span>Bar</span><span style='baz'>foo</span>";
    while(line.contains(rx)){
        qDebug()<<"Found rx!";
        line.remove (rx);
    }
}

Ho testato l'espressione regolare online utilizzando questo strumento . Con la data stringa regex e un testo di esempio di <span style="foo">Bar</span> lo strumento dice che l'espressione regolare deve essere trovata nella stringa. Nel mio codice di Qt, tuttavia, non sono mai entrare nel mio ciclo while.

Non ho davvero mai usato regex prima, in Qt o qualsiasi altra lingua. Qualcuno può fornire qualche aiuto? Grazie!

[modifica] Così ho scoperto che QRegExp ha una funzione errorString() da usare se l'espressione regolare non è valido. uscita I questo e vedere: "Sintassi ripetizione cattivo". Non realmente sicuro che cosa questo significa. Naturalmente, googling per "sintassi ripetizione cattivo" porta in primo piano ... questo post. Accidenti Google, è veloce.

È stato utile?

Soluzione

Il problema è che QRegExp supporta solo quantificatori greedy. Più precisamente, supporta o avido o quantificatori riluttanti, ma non entrambi . Così, <span(.*?)> non è valida, poiché non v'è nessun operatore *?. Invece, è possibile utilizzare

QRegExp rx("<span(.*)>");
rx.setMinimal(true);

Questo darà tutti *, +, e ? nel QRegExp il comportamento di *?, +?, e ?? rispettivamente, piuttosto che il loro comportamento di default. La differenza, come si può o non può essere a conoscenza, è che le versioni minime corrispondono come alcuni caratteri possibile, piuttosto che come molti .

In questo caso, è possibile anche scrivere

QRegExp rx("<span([^>]*)>");

Questo è probabilmente quello che vorrei fare, dal momento che ha lo stesso effetto: partita fino a vedere un >. Il vostro è più generale, sì (se si dispone di un multi-carattere finale token), ma penso che questo sia un po 'più bello, nel caso semplice. O funziona, naturalmente.

Inoltre, essere molto, molto attenti a proposito di parsing del codice HTML con le espressioni regolari . Non si può effettivamente farlo, e riconoscendo i tag è-while (credo) possibile, molto più difficile che solo questo. (Commenti, blocchi CDATA, e le istruzioni di elaborazione gettare una chiave nelle opere.) Se si conosce il tipo di dati che stai guardando, questa può essere una soluzione accettabile; anche così, mi piacerebbe guardare in un parser HTML invece.

Altri suggerimenti

Che cosa stai cercando di raggiungere? Se si desidera rimuovere il tag di apertura e dei suoi elementi, allora il modello

<span[^>]*>

è probabilmente il più semplice.

La sintassi. *? mezzi coi non avido che è ampiamente supportato, ma può confondere il motore regex QT.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top