c++ 如何在Qt中从给定的QString中获取子串

nvbavucw  于 2023-01-15  发布在  其他
关注(0)|答案(3)|浏览(269)

我有一个这样的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编写这个代码。

qcuzuvrc

qcuzuvrc1#

一种方法是使用

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);

如果要解析的字符串以这种方式保持不太一致,请尝试切换到正则表达式,它们是更灵活的方法。

ffx8fchx

ffx8fchx2#

使用QString::split 3次:

  • QLatin1Char('=')拆分为两部分:
  • SOFT_PACKAGES.ABC
  • MY_DISPLAY_OS:MY-Display-OS.2022-3.10.25.10086-1.myApplication
  • 接下来,用QLatin1Char(':')拆分第二部分,如果不能有超过2个部分,则可能再次拆分为仅2个部分,因此第二部分可以包含冒号:
  • MY_DISPLAY_OS
  • MY-Display-OS.2022-3.10.25.10086-1.myApplication
  • 最后,按QLatin1Char('.')拆分上一步的第2部分:
  • MY-Display-OS
  • 2022-3
  • 10
  • x1米11米1x
  • 10086-1
  • myApplication

现在只需将这些部分组合成所需的输出字符串。如果不知道确切的部分数量,可以从上面的最终列表中删除前两个元素和最后一个元素,然后用QLatin1Char('.')连接其余元素,从而得到Version = 10.25.10086-1。如果索引已知且固定,则可以使用QStringLiteral("%1.%2.%3").arg(...

gcmastyq

gcmastyq3#

根据我的经验,对于这些类型的任务,使用正则表达式通常更简单,也更健壮。您可以使用正则表达式来实现这一点,如下所示:

// 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是一个强大的工具,一旦你习惯了它,但它肯定会在第一次似乎令人望而生畏。
www.example.com上此正则表达式的示例regex101.com:https://regex101.com/r/dj3Z4U/1

相关问题