QRegExp не совпадает, хотя regex101.com не совпадает
Мне нужно извлечь некоторые данные из строки с простым синтаксисом. Синтаксис такой:
_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. Есть ли обходной путь для этого?
1 ответ
Похоже, 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)
,