【发布时间】:2016-08-15 12:59:29
【问题描述】:
我需要用简单的语法从字符串中提取一些数据。语法是这样的:
_IMPORT:<strong>[any text]</strong> - <strong>[HEX number]</strong> #<strong>[decimal number]</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。有什么解决方法吗?
【问题讨论】:
-
没有正则表达式的经验。但是
IMPORT:**(**和所有其他人之后的圆括号对我来说看起来很奇怪。 - 我希望 RegExp 匹配(character,它不在表达式中。但是,如果他们有正则表达式语义,请忘记我的评论。 -
@BernhardHeinrich 他们使用(引用文档)“类似 Perl 的丰富模式匹配语法”,这意味着存在捕获组,我过去使用过它们没有问题。
-
我看到将
(.*?)更改为(.*)会有所帮助,但不知道为什么。更改正则表达式引擎也无济于事...... -
@mike.dld 似乎他们得到了相反的方式,因为
(.*?)不贪心以防止匹配 ` - [hex]` 部分。 -
已经使用 QRegularExpression 了! :) QRegExp 支持非常有限的模式语法(特别是:它不支持非贪婪量词)。 QRegularExpression 支持 PCRE。