2

我正在尝试扫描给定字符串中的数字。数字不能在“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}.*\\))- 否定前瞻断言:数字不能在 ) 之前,除非它之前有 (。

令人抓狂的是,如果我去掉后视断言,它就起作用了。这里有什么问题?我正在使用 RegexKitLite,它使用 ICU 正则表达式语法。

4

2 回答 2

3

negative lookbehind的位置不正确。Lookbehind不修改输入位置,你negative lookbehind应该在你的\d{1,4}表达之后:

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

或者,只需使用 anegative lookahead来完成相同的目的:

(?i)(?!v|vol|vol\\.|v\\.)\\d{1,4}(?![\\(]{0}.*\\))
于 2010-11-22T20:56:24.883 回答
1

最后以这个正则表达式结束:

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

消极的后视需要改变。通过了我所有的测试。感谢 Alex 发现我的 NLB 的定位是错误的。

于 2010-11-23T18:15:17.163 回答