2013-05-30 30 views
1

我想在iOS上創建一個正則表達式來獲取<BR>:之間的子字符串。得到<BR>之間的字符串和:<BR>在子串內

我已經試過這一點,但它不會工作:

<BR>[A-Z](.*[^<BR>]): 

這是一個文字的例子,其中我只想要得到的THE TEXT I WANT

TEST TEST TEST TEST TEST TEST<BR>THE TEXT I WANT:more text <BR>TEST TEST TEST TESTTEST TESTTEST TEST<BR>TEST TESTTEST TESTTEST TESTTEST TEST<BR>THE TEXT I WANT:TEST TESTTEST TESTTEST TESTTEST TEST

我的正則表達式似乎在第一個:之後得到文本,並在我不感興趣的第二個:之後停止。

我想THE TEXT I WANT它發生時,沒有別的。

我該怎麼做?

+2

每當你可以使用HTML解析器(如一個包含在libxml2中)來解析HTML,而不是正則表達式。正則表達式無法處理HTML中存在的太多問題。 –

回答

2

我對objectve-c沒有任何經驗,所以我實在無法給出實施建議。這個正則表達式適用於您提供的示例文本。在不區分大小寫的選項中使用它。在BR和冒號之間的文本捕獲組內發現1

<BR\s*/?\s*>([\w\s]+): 

這將只允許字母,數字,下劃線和空格是BR標籤和結腸之間。您當然可以在角色類中添加其他角色,但是如果添加了所有允許您構建標籤的角色,它將不再正常工作。

如果您的正則表達式引擎支持負向預測,那麼您可以改用下一個正則表達式。在不區分大小寫的選項中使用它。在BR和冒號之間的文本捕獲組內發現1

<BR\s*/?\s*>(?![^:]+<BR\s*/?\s*>)([^:]+): 

下面是這最後的正則表達式的大概分類:

<BR\s*/?\s*>   #Match the starting BR tag. 
(?![^:]+<BR\s*/?\s*>) #Make sure that there are no BR tags between this BR tag and the next colon character. 
([^:]+):    #GROUP 1: Match every character up to the next colon character. 
+2

以供參考 - iOS的正則表達式庫(NSRegularExpression)實際上支持負向預測。 –

+0

謝謝! '(?![^:] + )([^:] +):'完美無缺! :-) –

0
NSArray *pieces = [inputString componentsSeparatedByString:@"<BR>"]; 
NSInteger numberOfPieces = [pieces count]; 
for (NSInteger i = 1; i < numberOfPieces; i++) { 
    NSArray *subpieces = [[pieces objectAtIndex:i] componentsSeparatedByString:@":"]; 
    if ([subpieces count] > 1) { 
     // [subpieces objectAtIndex:0] is the string you're interested in 
    } 
} 
+0

這不是很靈活。它不會匹配小寫''br's,而且它不適用於正確形成的HTML(例如'
')。 –

+0

當他說'<'。 –

+2

我想這可能是OP試圖解析HTML,但從他給出的示例字符串,這種天真的方法將工作正常。如果這實際上不是他開始的輸入,那麼另一種解決方案可能更合適。 – bdesham

相關問題