2016-01-21 78 views
0

我正試圖讓一些文字被<td>標籤包圍。我的問題是,我能夠僅獲取第一個結果,並且無法獲取其他結果。Qt/QRegularExpression - 無法捕獲所有結果,只有第一個實例,爲什麼?

從下面的HTML,我只得到第一個結果是這樣的文字:

學生姓名

但所有其他試圖捕捉到所需的文本的其餘部分是空的,空。爲什麼那&我做錯了什麼?

文本的正則表達式來工作:

<table width="52%" border="1" align="center" cellpadding="1" cellspacing="1"> 
    <tr> 
    <td colspan="2" align="center" bgcolor="#999999">Result</td> 
    </tr> 
    <tr> 
    <td width="22%"><strong>Student ID</strong></td> 
    <td width="78%">13/0003337/99</td> 
    </tr> 
    <tr> 
    <td><strong>Student Name</strong></td> 
    <td>Alaa Salah Yousuf Omer</td> 
    </tr> 
    <tr> 
    <td><strong>College</strong></td> 
    <td>Medicine & General Surgery</td> 
    </tr> 
    <tr> 
    <td><strong>Subspecialty</strong></td> 
    <td>General</td> 
    </tr> 
    <tr> 
    <td><strong>Semester</strong></td> 
    <td>Fourth</td> 
    </tr> 
    <tr> 
    <td><strong>State</strong></td> 
    <td>Pass</td> 
    </tr> 
    <tr> 
    <td><strong>Semester's GPA</strong></td> 
    <td>2.89</td> 
    </tr> 
    <tr> 
    <td><strong>Overall GPA</strong></td> 
    <td>3.13</td> 
    </tr> 
    </table> 

我的代碼:

QString resultHTML = "A variable containing the html code written above." 

QRegularExpression regex("<td>(.*)</td>", QRegularExpression::MultilineOption); 
QRegularExpressionMatch match = regex.match(resultHTML); 

// I only get the 1st result logged withing debugger 
for(int x = 0; x <= match.capturedLength(); x++) 
{ 
    qDebug() << match.captured(x); 
} 

// This here doesn't get me anything, null! 
_studentName = match.captured(2); 
_semesterWritten = match.captured(8); 
_stateWritten = match.captured(10); 
_currentGPA = match.captured(12); 
_overallGPA = match.captured(14); 
+0

請不要通過解析HTML使用正則表達式! – peppe

+0

@peppe當然可以,但使用少量數據時,我只是希望儘可能簡單。 –

回答

2

您正在尋找應用什麼的Perl是指爲全球正則表達式標誌/修飾符,表示繼續在f後面查找匹配項第一個被發現。

爲了做到這一點與QT,嘗試使用globalMatch()match()

前者將返回一個QRegularExpressionIterator,通過它您可以迭代查找所有匹配項。

此外,則*<td>(.*)</td>是貪婪的,所以它會找到<td>初審,然後捕獲爲地(包括你的大多數內容和附加<td>標籤),只要它可以在最後找到</td>

有不同的方法來避免這種情況。一種方法是使用<td>(.*?)</td>,這將拍攝爲越好,只要能找到一個</td>底。這基本上會捕獲一個標籤內的所有東西,只要沒有另一個嵌套在其中(在您的方案中看起來不是這種情況)內嵌的另一個<td />

此外,在這裏不需要的QRegularExpression::MultilineOption PatternOption,因爲它涉及到的正則表達式字符^$,你不使用。

你可能反而會喜歡QRegularExpression :: DotMatchesEverythingOption PatternOption,其中包括點換行,以防萬一那些<td />標籤,或者其中包含的價值,恰好跨越多行

2

。 ..Global匹配是非常有用的發現所有出現一個主題字符串中給定的正則表達式的 ...

QRegularExpressionMatchIterator i = regex.globalMatch(resultHTML); 

while (i.hasNext()) 
{ 
    QRegularExpressionMatch match = i.next();   
    qDebug() << match.captured(); 
} 
相關問題