我有一个这样的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编写这个代码。
3条答案
按热度按时间qcuzuvrc1#
一种方法是使用
因此您可能需要类似以下内容:
要提取您请求的另一部分,并且如果要检查的所有字符串沿着.""字符数保持不变,则可以使用第二个参数IndexOf来查找、移动起始位置以跳过已知的多次出现.“”,例如
应该给予正确的索引来裁剪
如果要解析的字符串以这种方式保持不太一致,请尝试切换到正则表达式,它们是更灵活的方法。
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
10086-1
myApplication
现在只需将这些部分组合成所需的输出字符串。如果不知道确切的部分数量,可以从上面的最终列表中删除前两个元素和最后一个元素,然后用
QLatin1Char('.')
连接其余元素,从而得到Version = 10.25.10086-1
。如果索引已知且固定,则可以使用QStringLiteral("%1.%2.%3").arg(...
。gcmastyq3#
根据我的经验,对于这些类型的任务,使用正则表达式通常更简单,也更健壮。您可以使用正则表达式来实现这一点,如下所示:
当然,要让这个有意义,你必须理解正则表达式,所以下面是我对这里使用的正则表达式的解释:
我认为通常来说,创建一个处理输入更改的正则表达式(比如版本变为
10.25.10087
)比手动通过索引解析更容易。Regex是一个强大的工具,一旦你习惯了它,但它肯定会在第一次似乎令人望而生畏。
www.example.com上此正则表达式的示例regex101.com:https://regex101.com/r/dj3Z4U/1