Как получить подстроку из данной QString в Qt

У меня есть QString, как это:

QString fileData = "SOFT_PACKAGES.ABC=MY_DISPLAY_OS:MY-Display-OS.2022-3.10.25.10086-1.myApplication"

Что мне нужно сделать, так это создать подстроки следующим образом:

SoftwareName = MY_DISPLAY_OS //text after ':'
Version = 10.25.10086-1
Release = 2022-3

Я пытался использовать QString QString::sliced(qsizetype pos, qsizetype n) const, но это не сработало, так как я использую 5.9, а это поддерживается в 6.0.

QString fileData = "SOFT_PACKAGES.ABC=MY_DISPLAY_OS:MY-Display-OS.2022-3.10.25.10086-1.myApplication";

QString SoftwareName = fileData.sliced(fileData.lastIndexOf(':'), fileData.indexOf('.'));

Пожалуйста, помогите мне закодировать это в Qt.

Затем используйте QString::split(), чтобы разделить строку.

chehrlic 10.01.2023 19:21
doc.qt.io/qt-6/qregularexpression.html
BanAnn 11.01.2023 01:10
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
О тренинге HTML JavaScript :HTML (язык гипертекстовой разметки) и CSS (каскадные таблицы стилей) - две основные технологии для создания веб-страниц....
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем...
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
0
2
93
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Один из способов использования

QString::mid(int startIndex, int howManyChar);

Поэтому вы, вероятно, хотите что-то вроде этого:

QString fileData = "SOFT_PACKAGES.ABC=MY_DISPLAY_OS:MY-Display-OS.2022-3.10.25.10086-1.myApplication";

QString SoftwareName = fileData.mid(fileData.indexOf('.')+1, (fileData.lastIndexOf(':') - fileData.indexOf('.')-1));

Чтобы извлечь другую часть, которую вы запросили, и если количество «.» символы остаются постоянными во всех строках, которые вы хотите проверить, вы можете использовать второй аргумент IndexOf, чтобы найти смещение начального местоположения, чтобы пропустить множество известных вхождений '.', например

int StartIndex = 0;
int firstIndex = fileData.indexOf('.');
for (int i=0; i<=6; i++) {
    StartIndex += fileData.indexOf('.', firstIndex+StartIndex);
}

int EndIndex = fileData.indexOf('.', StartIndex+8);

Должен дать правильные индексы, которые нужно вырезать с помощью

QString SoftwareVersion = fileData.mid(StartIndex, EndIndex - StartIndex);

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

Ваша подсказка сработала. но любые предложения о том, как получить "10.25.10086-1"

Sudhanshu Ojha 10.01.2023 20:16

Как сейчас написано, ваш ответ неясен. Пожалуйста, отредактируйте , чтобы добавить дополнительные сведения, которые помогут другим понять, как это отвечает на заданный вопрос. Вы можете найти больше информации о том, как писать хорошие ответы в справочном центре.

Community 10.01.2023 21:37
Ответ принят как подходящий

Используйте QString::split 3 раза:

  1. Разделить на QLatin1Char('=') на две части:

    • SOFT_PACKAGES.ABC
    • MY_DISPLAY_OS:MY-Display-OS.2022-3.10.25.10086-1.myApplication
  2. Затем разделите 2-ю часть на QLatin1Char(':'), возможно, снова только на 2 части, если никогда не может быть более 2 частей, поэтому 2-я часть может содержать двоеточия:

    • MY_DISPLAY_OS
    • MY-Display-OS.2022-3.10.25.10086-1.myApplication
  3. Наконец, разделите вторую часть предыдущего шага на QLatin1Char('.'):

    • MY-Display-OS
    • 2022-3
    • 10
    • 25
    • 10086-1
    • myApplication

Теперь просто соберите необходимые выходные строки из этих частей. Если точное количество частей неизвестно, вы можете получить Version = 10.25.10086-1, удалив два первых элемента и последний элемент из окончательного списка выше, а затем соединив остальные с помощью QLatin1Char('.'). Если индексы известны и фиксированы, вы можете просто использовать QStringLiteral("%1.%2.%3").arg(....

По моему опыту, использование регулярных выражений для таких задач обычно проще и надежнее. Вы можете сделать это с помощью регулярных выражений со следующим:

// Create the regular expression.
// Using C++ raw string literal to reduce use of escape characters.
QRegularExpression re(R"(.+=([\w_]+):[\w-]+\.(\d+-\d+)\.(\d+\.\d+\.\d+-?\d+))");

// Match against your string
auto match = re.match("SOFT_PACKAGES.ABC=MY_DISPLAY_OS:MY-Display-OS.2022-3.10.25.10086-1.myApplication");

// Now extract the portions you are interested in
// match.captured(0) is always the full string that matched the entire expression
const auto softwareName = match.captured(1);
const auto version = match.captured(3);
const auto release = match.captured(2);

Конечно, чтобы это имело смысл, вы должны понимать регулярное выражение, поэтому вот мое объяснение используемого здесь регулярного выражения:

.+=([\w_]+):[\w-]+\.(\d+-\d+)\.(\d+\.\d+\.\d+-?\d+)

.+=
get all characters up to and including the first equals sign

([\w_]+)
capture one or more word characters (alphanumeric characters) or underscores

:
a colon

[\w-]+\.
one or more alphanumeric or dash characters followed by a single period

(\d+-\d+)
capture one or more of digits followed by a dash followed by one or more digits

\.
a single period

(\d+\.\d+\.\d+-?\d*)
capture three sets of digits with periods in between, then an optional dash, and any number of digits (could be zero digits)

Я думаю, что, как правило, проще создать регулярное выражение, которое обрабатывает изменения ввода - скажем, версия становится 10.25.10087 - проще, чем вручную анализировать вещи по индексу.

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

Пример этого регулярного выражения на regex101.com: https://regex101.com/r/dj3Z4U/1

Другие вопросы по теме