c++ - Qt/QRegularExpression - 无法捕获所有结果,只能捕获第一个实例,为什么?

标签 c++ regex qt qregexp qregularexpression

我试图让一些文字被 <td> 包围标签。我的问题是我只能获取第一个结果,而不能获取其他结果。

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

Student Name

但是所有其他捕获所需文本其余部分的尝试都是空的,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);

最佳答案

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

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

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

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

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

此外,此处不需要 QRegularExpression::MultilineOption PatternOption,因为它属于正则表达式字符 ^$,而您不是不使用。

您可能反而对 QRegularExpression::DotMatchesEverythingOption PatternOption 感兴趣,它包括点中的换行符,以防那些 <td /> 标记或其中包含的值发生跨越多行

关于c++ - Qt/QRegularExpression - 无法捕获所有结果,只能捕获第一个实例,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34931566/

相关文章:

c++ - 使用 'delete' 运算符清理内存时出现“调试断言失败”错误

c++ - getch() 和 scanf() 函数之间的区别

c++ - 具有符合 STL 的常量迭代器的非常量引用类型?

c++ - 在 Qt OpenGL 中制作移动的二维对象

c++ - 为什么 'control reaches end of non-void function' 只是一个警告?合法吗?

javascript - 使用 JavaScript 解析主题标签文本并替换为链接

regex - 在 Linux 中删除文件名中的空格

python重新匹配组: number after\number

c++ - Qt 模型/ View 委托(delegate) : How to simply translate text data?

debugging - 调试时禁用 qt creator 自动构建