2010-12-22 46 views
2
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); 
    } 
} 

我已經使用this tool在線測試了正則表達式。使用給定的正則表達式字符串和<span style="foo">Bar</span>的示例文本,該工具說它應該在字符串中找到正則表達式。然而,在我的Qt代碼中,我永遠不會進入我的while循環。需要Qt中正則表達式的幫助(QRegExp)[錯誤重複語法?]

我真的從來沒有使用正則表達式之前,Qt中或任何其他語言。有人可以提供一些幫助嗎?謝謝!

所以我剛發現QRegExp有一個函數errorString()用於在正則表達式無效的情況下使用。我輸出這個並看到:「壞的重複語法」。不確定這意味着什麼。當然,搜索「糟糕的重複語法」會帶來......這篇文章。該死的谷歌,你快。

+0

啊。 HTML和正則表達式!立即閱讀http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454! – Macke 2010-12-22 08:20:50

回答

11

的問題是,QRegExp只支持貪婪量詞。更確切地說,it supports either greedy or reluctant quantifiers, but not both。因此,<span(.*?)>無效,因爲沒有*?運算符。相反,你可以使用

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

這會給*+,並且?QRegExp*?+???,分別是行爲,而不是它們的默認行爲。所不同的,因爲你可能會或可能不知道,是最小的版本匹配爲幾個角色成爲可能,而不是許多。直到你看到一個>比賽:

在這種情況下,你也可以寫

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

這可能是我會做什麼,因爲它具有相同的效果。你的是更一般的,是的(如果你有一個多字符結束標記),但我認爲這在簡單的情況下稍微好一些。當然,兩者都可以工作。

此外,be very, very careful about parsing HTML with regular expressions。你實際上做不到,識別標籤是 - 雖然(我相信)可能 - 比這更難。 (註釋,CDATA模塊和處理指令在工作中會引發一些問題。)如果您知道您正在查看的數據類型,這可能是一個可以接受的解決方案;即使如此,我也會查看HTML解析器。

+0

額外的+1鏈接到史詩般的HTML正則表達式答案。 :) – Macke 2010-12-22 08:21:18

1

你想達到什麼目的?如果你想刪除開始標記及其內容,那麼該模式

<span[^>]*> 

可能是最簡單的。

語法。*?意味着非廣泛支持的非貪婪匹配,但可能會混淆QT正則表達式引擎。