Qt — Как получить строку из 2 символов?

#regex #qt

#регулярное выражение #qt

Вопрос:

Я работаю над Qt, используя string. Как я могу получить строку из 2 символов ‘#’ и ‘:’

мои строки ниже:

 #id:131615165

#1:aaa,s1

#23:dd

#526:FE
  

результат, который я хочу получить, это: «идентификатор», «1», «23», «526».

Большое спасибо за любую помощь.

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

1. Есть поговорка, которая звучит примерно так: у программиста возникла проблема. Он решил решить это с помощью регулярных выражений. Теперь у программиста две проблемы. Регулярные выражения — это мощный инструмент в нужной ситуации, но также очень сложный и подверженный ошибкам. В вашем случае вы могли бы просто найти позицию ':' , затем получить подстроку до этой позиции и пропустить первый символ (the '#' ). Это просто и легко писать и отлаживать.

Ответ №1:

Решение с использованием QRegularExpression :

 QRegularExpression regex("^#(. ?):");
qDebug() << regex.match("#id:131615165").captured(1);
  

Объяснение шаблона:

  • ^ соответствует началу строки
  • # соответствует символу #
  • (. ?) является ли группа захвата, в которой:
    • . соответствует любому символу, кроме символов завершения строки
    • соответствует одному или нескольким символам
    • ? это «ленивое» сопоставление для обработки ситуаций, когда в строке присутствует несколько двоеточий.
  • : соответствует символу :

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

1. почему вы публикуете дважды?… пожалуйста, в следующий раз рассмотрите возможность редактирования ответа вместо повторной публикации того же ответа….

Ответ №2:

QString Решение на основе:

 QString s("    #iddfg:131615165");
int startPos = s.indexOf('#')   1;
int endPos = s.indexOf(':');
int length = endPos - startPos;
qDebug() << startPos << length << s.mid(startPos, length);
  

Ответ №3:

Я настоятельно рекомендую онлайн-тестер регулярных выражений, чтобы начать с регулярного выражения, например:https://regex101.com

Используя следующий код, вы можете записывать данные из QString:

 QString input = "#id:131615165";
QRegExp test("#(.*):");
if(test.exactMatch(input))
{
    qDebug() << "result:" << test.cap(1);
}
  

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

1. Я пробовал, появляется предупреждение о неизвестной escape-последовательности ‘ #’

2. Извините за ошибку, сообщение было отредактировано путем удаления дополнительной косой черты (было ошибочно скопировано с regex101.com )

Ответ №4:

Как написал @Someprogrammerdude в комментариях:

 QString getTag(QString const amp;input)
{
    QString resu<
    int idx = input.indexOf(':');
    if(input.startsWith('#') amp;amp; idx > 1) {
        int len = idx - 1;
        result = input.mid(1, len); // [0]='#', [idx]=':'
    }
    return resu<
}