QRegExp 不匹配,即使 regex101.com 匹配
QRegExp does not match even though regex101.com does
我需要使用简单的语法从字符串中提取一些数据。语法是这样的:
_IMPORT:<strong>[任意文本]</strong> - <strong>[十六进制数]</strong>#<strong>[十进制数]</strong>
因此我创建了正则表达式,您可以在下面的代码中看到:
//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。有什么解决方法吗?
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)
设置贪心求值。
我需要使用简单的语法从字符串中提取一些数据。语法是这样的:
_IMPORT:<strong>[任意文本]</strong> - <strong>[十六进制数]</strong>#<strong>[十进制数]</strong>
因此我创建了正则表达式,您可以在下面的代码中看到:
//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。有什么解决方法吗?
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)
设置贪心求值。