Есть ли в Qt в QRegExp позиционные проверки?

370
18 июня 2017, 17:30

Вот такие вот проверки:

(?<=) - слева совпадает
(?<!) -  слева несовпадает
(?=) - справа совпадает
(?!) - справа несовпадает

Очень надо, но у меня не получается составить рабочее выражение, не находит. Нигде ничего по этому вопросу не написано, примеров не нашел. Есть ли вообще там такая возможность? Если есть, напишите пожалуйста, простой пример или ссылку использования таких проверок.

Answer 1

В QReqExp reg("(?<=<title>)[.]{0,10}(?=</title>)") [.] — это символьный класс, который находит символ . (буквальная точка).

Вам нужен

QReqExp reg("(?<=<title>)[^<]{0,10}(?=</title>)")

или

QReqExp reg("(?<=<title>)[^<]+(?=</title>)")

Тут

  • (?<=<title>) - место в строке, непосредственно следующее после <title>
  • [^<]{0,10} - от 0 до 10 символов, отличных от < ([^<]+ - 1+ таких символов)
  • (?=</title>) - место в строке, непосредственно перед </title>.

В Qt5 действительно лучше использовать QRegularExpression, использующий регулярные выражения PCRE.

Ещё можно переписать выражение с использованием захватывающей группы вместо блоков предварительного просмотра вперёд и назад:

(?i)<title>([^<]+)</title>

См. демо регулярного выражения на regex101.com. Круглые скобки формируют захватывающую группу, доступ к которой осуществляется с помощью match.captured(1).

Пример на Qt с использованием захватывающей группы:

QString s = "More <title>Super title</title> text More <title>Super title 2</title> text";
QRegularExpression reg = QRegularExpression("(?i)<title>([^<]+)</title>");
QRegularExpressionMatchIterator i = reg.globalMatch(s);
while (i.hasNext()) {
    QRegularExpressionMatch match = i.next();
    qDebug() << match.captured(1);
}

PS: (?i) = QRegularExpression::CaseInsensitiveOption.

Answer 2

QRegExp является чрезвычайно ограниченным и устаревшим классом, используйте QRegularExpression, который поддерживает регулярные выражением в той мере, в какой их поддерживает Perl.

Answer 3

У меня получилось только с классом QRegularExpression. Пишу код:

QString str = "<title>Ищу<</title>";
    QRegularExpression re("(?<=<title>).+(?=</title>)",QRegularExpression::MultilineOption);
   //(?<=<title>)[^<]+(?=</title>) это регулярное выр. тоже работает
      QRegularExpressionMatch match = re.match(str);
      if (match.hasMatch()) {
          QString matched = match.captured(0);
          qDebug() <<"matched="<<matched;  //matched= "Ищу<"
      }
READ ALSO
Буфер обмена - C++ WinAPI

Буфер обмена - C++ WinAPI

Здравствуйте, помогите пожалуйста, нужно сделать программу, которая демонстрирует, передачу информации различных форматов(текст, графика)...

413
Использование __VA_ARGS__ в define если аргументов нет

Использование __VA_ARGS__ в define если аргументов нет

Например, есть код где всё уже определено :

265
Цикл внутри потока. С++

Цикл внутри потока. С++

Здравствуйте!

252
Анонимная функция

Анонимная функция

Есть кусок кода из учебника:

339