2010-11-22 59 views
2

我試圖掃描給定的字符串的數字。該號碼不能在「v/v。/ vol/vol。」之後,且不能在括號內。這是我有什麼:使用ICU正則表達式查找不在括號內的數字的正則表達式問題

NSString *regex = @"(?i)(?<!v|vol|vol\\.|v\\.)\\d{1,4}(?![\\(]{0}.*\\))"; 
NSLog(@"Result: %@", [@"test test test 4334 test test" stringByMatching:regex]); 
NSLog(@"Result: %@", [@"test test test(4334) test test" stringByMatching:regex]); 
NSLog(@"Result: %@", [@"test test test(vol.4334) test test" stringByMatching:regex]); 

令人生氣的是,這是行不通的。我正則表達式可以分成四個部分:

(?i) - 讓正則表達式不區分大小寫

(?<!v|vol|vol\\.|v\\.) - 負向後看斷言爲V/V /體積/體積。

\\d{1,4} - 我正在查找的數字是1-4位數字。

(?![\\(]{0}.*\\)) - 負先行斷言:號碼不能被前面的),除非有一個(前

令人惱火的,如果我拿出向後看斷言,它的工作原理這裏有什麼問題。?我使用RegexKitLite,它使用正則表達式ICU語法

回答

3

negative lookbehind位置不正確回顧後的不修改輸入位置,您應該negative lookbehind您來表達\d{1,4}後:。

(?i)\\d{1,4}(?<!v|vol|vol\\.|v\\.)(?![\\(]{0}.*\\)) 

或者,只是用一種negative lookahead來達到相同的目的:

(?i)(?!v|vol|vol\\.|v\\.)\\d{1,4}(?![\\(]{0}.*\\)) 
+0

我注意到Java`Pattern`類中的可變寬度後視可能嚴重影響性能。儘管我還沒有使用過ICU庫,只是流口水了,所以我不知道它在那裏是否仍然如此。 – tchrist 2010-11-22 22:04:43

1

終於結束了與此正則表達式:

(?i)\\d{1,4}(?<!v|vol|vol\\.|v\\.)(?![^\\(]*\\))

負向後看需要改變。通過我所有的測試。感謝Alex確定我的NLB的位置是錯誤的。