2016-08-15 99 views
0

我需要從簡單語法的字符串中提取一些數據。語法是這樣的:即使regex101.com QRegExp不匹配

_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 bug?我使用Qt 5.6。有沒有解決方法?

+0

沒有經驗的正則表達式。但是'IMPORT:**(**'和所有其他)對我來說看起來很奇怪。 - 我希望RegExp匹配'('字符,這不在表達式中,但如果他們有regexp-semantik,請忘記我的評論。 –

+0

@BernhardHeinrich他們使用(引用文檔)「*豐富的Perl-像模式匹配語法*「這意味着捕獲組存在,我已經在過去沒有使用過它們。 –

+0

我發現將'(。*?)'改成'(。*)'有幫助,但不知道爲什麼改變了正則表達式。引擎也沒有幫助...... –

回答

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)設置貪婪評估。

+0

非常感謝你這個不錯的答案! :)你有任何想法,如果這種行爲是故意的或不? '。*?'在RegExp中非常普遍,所以我覺得它是非常令人驚訝的... –

+1

看看'QRegularExpression' –

相關問題