2017-04-16 71 views
1

我沒有QRegExp類的問題,但現在我有一個。 我的代碼QRegExp html line

QRegExp re("d class=\\.green\\.>([+,0-9]+)<.td><td>[.0-9]+<.td><td>[.0-9]+<..n"); 
QString str=AliorLinia; 

qDebug()<<str; 
QStringList list; 
int pos=0; 

while((pos=re.indexIn(str, pos))!=-1){ 
    list << re.cap(1); 
    pos+=re.matchedLength(); 
} 

qDebug()<<list; 

控制檯告訴我

enter image description here

,海峽線在屏幕上

控制檯應該顯示+0,10但只顯示():(爲什麼?

+0

HTML不是[正規語言(https://en.wikipedia.org/wiki/Regular_language)所以使用正則表達式試圖解析它似乎有問題。 – MrEricSir

回答

1

,因爲你真正文字字符串看起來像

d class="green">+0.10</td><td>69.7</td><td>69.0</ 
<NEWLINE> 

\"你沒有得到匹配:但在C字符串字面這些兩個反斜槓應該由額外的斜線逃脫和\n你在調試器中看到的只是告訴你的字符串字面包含字面雙引號和換行符號(用10進制代碼字符)。

此外,您的號碼包含一個.,而不是,作爲小數點分隔符,因此您必須將其添加到[+,0-9]字符類。

所以,用最少的修訂您正則表達式可以像

QRegExp re("d class=.green.>([+.,0-9]+)<.td><td>[.0-9]+<.td><td>[.0-9]+<.\n"); 

the regex demo

+1

謝謝!它的工作:) –

+0

因爲它包含一個單一的值。你期望的5個值是什麼? –

+1

我將列表更改爲QString,現在沒關係,我的不好 –

0

因爲您的正則表達式模式要求​​屬性被字面包圍 - 這是\\.代表引用的字符串。

你真的想這裏的正則表達式是\\.(即反斜線字面後跟任何字符),這是正確的。

QRegExp re("d class=\\\\.green\\\\.>([+,0-9]+)<.td><td>[.0-9]+<.td><td>[.0-9]+<..n"); 
        ^^  ^^ 
       add these backslashes