Qt / QRegularExpression — Не удается захватить все результаты, только 1-й экземпляр, почему?

Я пытаюсь получить текст в окружении <td> теги. Моя проблема в том, что я могу получить только первый результат и не могу получить другие.

Из следующего HTML-кода я получаю только 1-й результат:

Имя ученика

Но все остальные попытки получить остальную часть необходимого текста пустые, нулевые. Это почему & Что я делаю неправильно?

Текст для регулярного выражения для работы:

<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

Решение

Вы хотите применить то, что Perl называет Глобальный Флаг / модификатор regex, что означает, продолжайте искать совпадения после того, как найден первый.

Чтобы сделать это с QT, попробуйте использовать globalMatch () против матч().

Бывший вернет QRegularExpressionIterator, по которому вы можете перебрать, чтобы найти все свои совпадения.

Дополнительно, * в <td>(.*)</td> жадный, поэтому он найдет первый экземпляр <td>, затем захватить как много насколько это возможно (включая большую часть вашего контента и дополнительные <td> теги), пока он может найти </td> в конце.

Есть разные способы избежать этого. Одним из способов является использование <td>(.*?)</td>, который будет захватывать как немного насколько это возможно, пока он может найти </td> в конце. Это по существу захватило бы все в пределах одного <td /> тег, пока нет другого <td /> вложенный дальше внутри (что не похоже на случай в вашем сценарии).

Дополнительно, QRegularExpression :: MultilineOption PatternOption здесь не нужен, так как он относится к символам регулярных выражений ^ а также $, который вы не используете.

Вы могли бы вместо этого быть заинтересованы в QRegularExpression :: DotMatchesEverythingOption PatternOption, который включает в себя новые строки в точках, на всякий случай те, <td /> теги или значения, содержащиеся в них, могут занимать несколько строк

2

Другие решения

…Глобальное соответствие полезно найти все случаи данного регулярного выражения внутри строки темы …

QRegularExpressionMatchIterator i = regex.globalMatch(resultHTML);

while (i.hasNext())
{
QRegularExpressionMatch match = i.next();
qDebug() << match.captured();
}
2

По вопросам рекламы [email protected]