2017-08-08 48 views
0

我正在嘗試使用Qt在我的C++應用程序中執行正則表達式。 我之前在C++中用Qt做過類似的正則表達式,但是這個很難。C++中的QRegExp捕獲部分字符串

給出一個帶有可選_#的字符串,在字符串末尾我想提取字符串的部分。

例子:

"blue_dog" should result "blue_dog" 
"blue_dog_1" should result "blue_dog" 
"blue_dog_23" should result "blue_dog" 

這是我到目前爲止的代碼,但它並沒有工作:

QString name = "blue_dog_23"; 
QRegExp rx("(.*?)(_\\d+)?");  
rx.indexIn(name); 
QString result = rx.cap(1); 

我甚至嘗試了許多變化以下附加選項沒有運氣。我上面的代碼總是以「」結尾:

rx.setMinimal(TRUE); 
rx.setPatternSyntax(QRegExp::RegExp2); 

回答

1

有時更容易不收拾的一切。單一的正則表達式在你的情況,你可以限制操縱現有_#後綴的情況下,否則結果是name

QString name = "blue_dog_23"; 
QRegExp rx("^(.*)(_\\d+)$"); 
QString result = name; 
if (rx.indexIn(name) == 0) 
    result = rx.cap(1); 

或者,你可以拆分的最後一位,並檢查它是否是一個編號的。緊湊(但可能不是最可讀的)解決方案:

QString name = "blue_dog_23"; 
int i = name.lastIndexOf('_'); 
bool isInt = false; 
QString result = (i >= 0 && (name.mid(i+1).toInt(&isInt) || isInt)) ? name.left(i) : name; 
+0

很好用!謝謝蒂姆。 – panofish

0

以下解決方案應該按照您的要求工作!

^[^\s](?:(?!_\d*\n).)*/gm

基本上,這是說匹配所有爲止,但不包括_\d*\n。這裏,_\d*\n表示匹配_字符,然後匹配任意數量的數字\d*,直到到達新的線標記\n?!是一個負面的前瞻,?:是一個非捕獲組。基本上,組合意味着?:之後的序列是代表應該捕獲內容的非包含端點的組。

^[^\s]告訴表達式匹配從行首開始匹配,只要第一個字符不是空格。

/gm設置全局標誌(允許一個以上的比賽要返回)和輯陣行標誌(允許序列匹配以往單一線路。