2011-07-28 86 views
2

我有一個正則表達式的問題。捕獲多個文本。

考慮,我們有一個字符串

S= "[sometext1],[sometext],[sometext]....,[sometext]" 

的「sometexts」的數量是未知的,這是用戶的輸入,並且可以從一個變化到..for例如,1000。

[sometext]是一些字符序列,但它們中的每一個都不是「,」,所以我們可以說[^,]。

我想通過一些正則表達式捕獲文本,然後遍歷循環中的文本。

QRegExp p=new QRegExp("???"); 
p.exactMatch(S); 
for(int i=1;i<=p.captureCount;i++) 
{ 
    SomeFunction(p.cap(i)); 
} 

例如,如果sometexts數爲3,我們可以用這樣的:

([^,]*),([^,]*),([^,]*). 

所以,我不知道寫什麼,而不是「???」任何任意的n。 我正在使用Qt 4.7,我沒有找到如何在類參考頁面上做到這一點。
我知道我們可以通過循環來做到沒有regexps或者循環生成正則表達式本身,但是這些解決方案並不適合我,因爲實際問題比這更復雜一點..

+0

正則表達式無法創建無限數量的捕獲組... – Nightfirecat

回答

3

一個可能的正則表達式匹配你想要的是:

([^,]+?)(,|$) 

這將匹配的字符串,以昏迷結束 「」 或行結束。我不確定最後一個元素是否會昏迷。

使用這個正則表達式在C#中的一個例子:

String textFromFile = "[sometext1],[sometext2],[sometext3],[sometext4]"; 

foreach (Match match in Regex.Matches(textFromFile, "([^,]+?)(,|$)")) 
{ 
    String placeHolder = match.Groups[1].Value; 

    System.Console.WriteLine(placeHolder); 
} 

此代碼打印以下屏幕:

[sometext1] 
[sometext2] 
[sometext3] 
[sometext4] 

使用一個例子QRegex我在網上找到這裏是一個解決方案,試圖接近您正在尋找什麼: (我發現的例子是:http://doc.qt.nokia.com/qq/qq01-seriously-weird-qregexp.html

QRegExp rx("([^,]+?)(,|$)"); 
rx.setMinimal(TRUE); // this is if the Qregex does not understand the +? non-greedy notation. 

int pos = 0; 
while ((pos = rx.search(text, pos)) != -1) 
{ 
    someFunction(rx.cap(1)); 
} 

我希望這可以幫助。

+0

是的,可能我會使用這個,謝謝。這會讓我的代碼更長,因爲還有一個相同類型但帶有不同分隔符的給定表達式的後綴和前綴,我希望可以用一個正則表達式來表達所有這些:) IT的奇怪現在任何當前版本的正則表達式都不支持它。我認爲這可能是很好的方式去爲他們的開發者:) –

+1

很高興我能夠幫助。 – Rob

0

我們可以做這一點,你可以使用非捕獲的逗號掛鉤,然後徵求了許多塊:

嘗試:

QRexExp p=new QRegExp("([^,]*)(?:,([^,]*))*[.]") 

非捕獲在文檔解釋說:http://doc.qt.nokia.com/latest/qregexp.html

請注意,我還將.括起來,因爲它在RegExp中有意義,您似乎希望它是一個文字時期。

+0

這不起作用。它將捕獲第一個「sometext」,之後它將捕獲第二個文本,但沒有更多:) –

+0

是的,你已經運行cap()在一個循環中。忘了那個怪癖。 ; - (該手冊更好地解釋了這一點:http://doc.qt.nokia.com/latest/qregexp.html#capturing-text – Mark

0

我只知道.net,它可以讓你指定一個可變數量的捕獲,並帶有一個單一的
表達式。示例 - (capture。* me)+
它創建一個可以迭代的捕獲對象。即使那樣,它也只能模擬
每個其他正則表達式引擎提供的內容。

大多數引擎提供增量匹配,直到從
循環中沒有剩下匹配爲止。 global標誌告訴引擎保持與最後一次成功匹配的地方保持匹配。

例(在Perl):

while ($string =~ /([^,]+)/g) { print $1,"\n" }