QRegExp получает дублирование в результате отладки

#qt #qregexp #qregularexpression

#qt #qregexp #qregularexpression

Вопрос:

Мой код :

 QString strExp="Sum(2 3)-Sum(5 3)";

QRegExp regexp("(Sum\([^)]*\))");
regexp.indexIn(strExp);

QStringList lst=regexp.capturedTexts();
qDebug()<<"CapturedCounts:"<<regexp.captureCount();

qDebug()<<lst;
  

Я получаю захваченное количество, равное 1, и qstring
выводит список отладки, как показано ниже

 ("Sum(2 3)", "Sum(2 3)").
  

Почему?

Ответ №1:

Первый элемент QRegExp::capturedTexts() списка — это вся согласованная строка.

В документе говорится:

QStringList QRegExp::capturedTexts() const

Возвращает список захваченных текстовых строк.

Первая строка в списке — это вся согласованная строка. Каждый последующий элемент списка содержит строку, которая соответствует подвыражению (захвату) регулярного выражения.

Другой пример:

 QString s = "abcd123";
QRegExp re("(ab).*(12)");

qDebug() << "indexIn:" << re.indexIn(s);
qDebug() << "captureCount:" << re.captureCount();
qDebug() << "capturedTexts:" << re.capturedTexts();
  

Вывод будет:

 indexIn: 0 
captureCount: 2 
capturedTexts: ("abcd12", "ab", "12") 
  

Если вы хотите получить все совпадения, вы можете использовать это:

 QString strExp="Sum(2 3)-Sum(5 3)";

QRegExp regexp("(Sum\([^)]*\))");
regexp.indexIn(strExp);

QStringList list;
int pos = 0;

while ((pos = regexp.indexIn(strExp, pos)) != -1) {
    list << regexp.cap(1);
    pos  = regexp.matchedLength();
}

qDebug() << "all matches:" << list;
  

Вывод:

 all matches: ("Sum(2 3)", "Sum(5 3)") 
  

Комментарии:

1. в моем примере, как можно извлечь эти типы в Qt

2. * что типы выражений

3. Я не понимаю вашего вопроса.

4. Как можно parseQString strExp=»Сумма (2 3)-Сумма (5 3)»; QRegExp регулярное выражение («(Сумма([^)]*))»)

5. Извините за неправильное понимание вопросов. Мне нужно знать о классе qt для синтаксического анализа арифметических выражений, таких как a * (b c) и sum (a b)