我正在尝试扫描给定字符串中的数字。该数字不能在“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正则表达式语法。
答案 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定位错误。