2014-03-07 76 views
3

我想捕獲位於字符SAT的2次出現之間並且不包含SAT的字符串。到目前爲止,我還發現了這一點,這是行不通的使用正則表達式捕獲,其中不匹配單詞

QLatin1String(".*SAT([^(SAT)]*)SAT.*") 

恐怕[^(SAT)]*沒有做我想要的東西,那就是尋找具有不字SAT的字符串。或者,也許我做捕獲的方式不好:

QRegExp rx(pat); 
int p = 0; 
QString cap = QString::null; 

if((p = rx.indexIn(str, p)) != -1) 
    cap = rx.cap(1).trimmed(); 
+1

不幸的是正則表達式對我來說都是巫術,但希望這是有幫助的http://stackoverflow.com/a/406408/2296458 – CoryKramer

回答

1

試試這個:

(?<=SAT)(.+?)(?=SAT) 

什麼它實際上是向後看,並轉發了SAT

如果你想每串測試和使用整個字符串作爲樣本,那麼就用這個修改後的版本:^(?<=SAT)(.+?)(?=SAT)$


順便說一句,只是嘗試這一個(SAT([^(SAT)]+)SAT),它似乎是也工作。這裏有一個演示:http://regex101.com/r/fJ4gO5

1

您可以使用惰性量詞'?'。

(?<=SAT).*?(?=SAT) 

基本上,你搜索SAT,然後你搜索儘可能少的符號,直到你找到第二個SAT。因此,您在捕獲的字符串中不會有SAT。

+0

大聲笑,你剛剛讓我幾秒鐘! –

0

我有這樣的一個:

第一,我的SAT第一次出現這種

const QString pat = QLatin1String("SAT(.*)"); 
QRegExp rx(pat); 
int p = 0; 
QString cap = QString::null; 

if((p = rx.indexIn(str, p)) != -1) 
    cap = rx.cap(1).trimmed(); 

再經過捕獲整個字符串,我找的SAT結果中的位置cap。如果我能再次的確找到這個SAT,我SAT之前選擇在cap人物:

QRegExp rxrev(QLatin1String("SAT")); 
if((p = rxrev.indexIn(cap, 0)) != -1) 
    cap = cap.mid(0,p); 

它的優勢,它僅使用簡單的方法QRegEx和工作。

相關問題