2010-11-22 30 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的位置是错误的。