正则表达式问题使用ICU正则表达式查找不在括号内的数字

时间:2010-11-22 20:48:23

标签: objective-c regex regexkitlite

我正在尝试扫描给定字符串中的数字。该数字不能在“v / v。/ vol / vol。”之后,并且不能在括号内。这就是我所拥有的:

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。/ vol / vol。

的负面后瞻断言

\\d{1,4} - 我正在寻找的号码,1-4位数。

(?![\\(]{0}.*\\)) - 负向前瞻断言:数字不能在a)之前,除非有(在它之前)。

疯狂地,如果我拿出后面的断言,它就可以了。这是什么问题?我正在使用RegexKitLite,它使用ICU正则表达式语法。

2 个答案:

答案 0 :(得分:3)

您的negative lookbehind定位错误。 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}.*\\))

答案 1 :(得分:1)

最后得到了这个正则表达式:

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

需要改变的负面观察。通过我所有的测试。感谢Alex确定我的NLB定位错误。