0

我正在尝试获取一些被<td>标签包围的文本。我的问题是我只能获取第一个结果,而无法获取其他结果。

从以下 HTML 中,我只得到第一个结果,即此文本:

学生姓名

但是所有其他捕获其余所需文本的尝试都是空的,null。为什么会这样&我做错了什么?

用于正则表达式的文本:

<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);
4

2 回答 2

2

您正在寻找应用 Perl 所指的全局正则表达式标志/修饰符,这意味着,在找到第一个匹配项后继续寻找匹配项。

为了使用 QT 做到这一点,请尝试使用globalMatch()match()

前者将返回一个QRegularExpressionIterator,您可以在其上进行迭代以查找所有匹配项。

另外* in<td>(.*)</td>是贪心的,所以它会找到 的第一个实例,然后尽可能<td>地捕获(包括你的大部分内容和附加标签),只要它能在末尾找到 a 即可。<td></td>

有不同的方法可以避免这种情况。一种方法是使用,它会尽可能<td>(.*?)</td>地捕获,只要它可以在末尾找到 a 。这基本上将捕获单个标签中的所有内容,只要其中没有进一步嵌套(在您的场景中看起来不是这种情况)。</td><td /><td />

此外,这里不需要 QRegularExpression::MultilineOption PatternOption,因为它与您没有使用的正则表达式字符^$相关。

您可能对QRegularExpression::DotMatchesEverythingOption PatternOption 感兴趣,它在点中包含换行符,以防这些<td />标签或其中包含的值碰巧跨越多行

于 2016-01-21T19:15:56.780 回答
2

...全局匹配对于在主题字符串中查找给定正则表达式的所有匹配项很有用...

QRegularExpressionMatchIterator i = regex.globalMatch(resultHTML);

while (i.hasNext()) 
{
    QRegularExpressionMatch match = i.next();        
    qDebug() << match.captured();
}
于 2016-01-21T19:36:23.610 回答