0

我需要用简单的语法从字符串中提取一些数据。语法是这样的:

_IMPORT:[any text] - [HEX number] #[decimal number]

因此我创建了正则表达式,您可以在下面的代码中看到:

 //SYNTAX:  _IMPORT:%1 - %2 #%3
 static const QRegExp matchImportLink("^_IMPORT:(.*?) - ([A-Fa-f0-9]+) #([0-9]+)$");
 QRegExp importLink(matchImportLink);
 QString qtWtf(importLink.pattern());
 const int index = importLink.indexIn(mappingName);

 qDebug()<< "Input string: "<<mappingName;
 qDebug()<< "Regular expression:"<<qtWtf;
 qDebug()<< "Result: "<< index;

出于某种原因,这不起作用,我得到这个输出:

Input string:  "_IMPORT:ddd - 92806f0f96a6dea91c37244128f7d00f #0"
Regular expression: "^_IMPORT:(.*?) - ([A-Fa-f0-9]+) #([0-9]+)$"
Result:  -1

我什至试图移除锚^$但这没有帮助,也是不受欢迎的。烦人的是,如果我在 regex101.com 中复制输出,则此正则表达式可以完美运行,您可以在此处看到:https ://regex101.com/r/oT6cY3/1

谁能解释这里有什么问题?我是否偶然发现了 Qt 错误?我使用 Qt 5.6。有什么解决方法吗?

4

1 回答 1

2

似乎 Qt 不认为限定符*?是有效的。检查方法是否符合QRegExp::isValid()您的模式。就我而言,它因此而不起作用。并且文档告诉任何无效的模式永远不会匹配。

所以我尝试的第一件事是跳过?完全适合您提供的所有捕获组的字符串。这是我的代码。

QString str("_IMPORT:ddd - 92806f0f96a6dea91c37244128f7d00f #0");
QRegExp exp("^_IMPORT:(.*) - ([A-Fa-f0-9]+) #([0-9]+)$");

qDebug() << "pattern:" << exp.pattern();
qDebug() << "valid:" << exp.isValid();
int pos = 0;
while ((pos = exp.indexIn(str, pos)) != -1) {
    for (int i = 1; i <= exp.captureCount(); ++i)
        qDebug() << "pos:" << pos << "len:" << exp.matchedLength() << "val:" << exp.cap(i);
    pos += exp.matchedLength();
}

这是结果输出。

pattern: "^_IMPORT:(.*) - ([A-Fa-f0-9]+) #([0-9]+)$"
valid: true
pos: 0 len: 49 val: "ddd"
pos: 0 len: 49 val: "92806f0f96a6dea91c37244128f7d00f"
pos: 0 len: 49 val: "0"

使用 Qt 5.6.1 测试。

另请注意,您可以使用QRegExp::setMinimal(bool).

于 2016-08-15T13:56:22.820 回答