2012-12-27 18 views
0

我有兩個QRegExp對象,用於搜索某些文本的開始和結束。我的代碼看起來是這樣的:Qt的QRegExp和方法命令

// strText defined earlier 
QRegExp start(...); 
QRegExp end(...); 

int iStart = start.indexIn(strText); 
int iEnd = end.indexIn(strText, iStart) + end.matchedLength(); 

我有一個關於這個代碼的兩個問題:

(1)假設每個正則表達式是尋找文本中找到。調用上面的代碼在運行時調用以下錯誤:

TerminalWindow.exe中0x66b48b3f未處理的異常:0xC0000005:訪問衝突讀取位置0x00000004。

我得到同樣的錯誤,如果我改變周圍的代碼如下:

int iStart = start.indexIn(strText); 
int iTemp = end.matchedLength(); 
int iEnd = start.indexIn(strText, iStart) + iTemp; 

在這第二代碼片段的錯誤對我來說很有意義,因爲內部matchedLength()可能是針對一個對象運行尚未分配。但是,我不明白爲什麼我會從第一個代碼片段中獲得相同的錯誤。在所有其他條件相同的情況下,不是從左到右的操作順序?如果我的代碼更改爲以下內容,然後我得到的結果我想到:

// strText defined earlier 
QRegExp start(...); 
QRegExp end(...); 

int iStart = start.indexIn(strText); 
int iEnd = end.indexIn(strText, iStart); 
iEnd += end.matchedLength(); 

(2)如果strText的從我的例子看起來像:

<start> 
    stackoverflow is awesome! 
</start> 
<start> 
    I like cake! 
</start> 
<start> 
    Girls are pretty! 
</start> 

我如何寫一個Qt的正則表達式那會捕獲每個啓動元素的內容?就像:

QRegExp reg("<start>(.*?)</start>"); 

即使它似乎應該與POSIX正則表達式(這是我相信Qt實現)一起工作,我永遠不會爲我工作。 (注意:我知道理想的方法是使用XML/HTML解析器(我實際上解析HTML),但我現在對正則表達式解決方案感興趣)。

謝謝!

回答

0

<>需要轉義。嘗試:

QRegExp reg("\<start\>(.*?)\</start\>"); 
0

我不能和你的第一個代碼片段重現該問題。它適用於我的Ubuntu盒子。

就你的正則表達式而言,有幾個問題。首先,您正在使用?爲了使您的正則表達式非貪婪,但它不適用於Qt。相反,您必須致電QRegExp.setMinimal(bool)方法。引述QRegExp reference docs

非貪婪匹配不能應用於單個量詞,但 可如果你的字符串是一樣的東西被應用到所有的量詞的格局

'<root>\n<start>\nSo is awesome!\n</start>\n<start>\nI like cake!\n</start>\n</root>' 

然後下面的正則表達式將正常工作(我的Ubuntu盒測試PyQt版本):

QRegExp rx("<start>\n(.*)\n</start>"); 
rx.setMinimal(true); 

現在,所有你需要做的是循環如下(不完全確定的是,我不是一個C++的傢伙):

QStringList list; 
int pos = 0; 
while ((pos = rx.indexIn(str, pos)) != -1) { 
    list << rx.cap(1); 
    pos += rx.matchedLength(); 
} 

我看到的第二個問題是,當你在說問題,一個正則表達式不應該用於這個任務。 Qt提供了QtXml模塊,其中包含許多用於處理XML數據的類。

在你的情況你有一種可能性是使用QDomDocument類。下面PyQt的代碼演示瞭如何做到這一點:

from PyQt4.QtXml import QDomDocument 

mydata = "<root><start>\nSo is awesome!\n</start>\n<start>\nI like cake!\n</start><start>\nI like girls!\n</start></root>" 
document = QDomDocument() 
document.setContent(mydata) 
root = document.documentElement() 
element = root.firstChildElement("start") 
while (not element.isNull()): 
    value = element.firstChild().nodeValue() 
    element = element.nextSiblingElement("start") 
    print value 

我敢肯定,你可以將其轉換爲Qt代碼很容易,如果你嘗試。

+0

我沒有收到任何有關答案的反饋。你能告訴我它是否有用嗎?如果不是,我可以改進它。 – Vicent