使用ICU regex / regexkitlite的正则表达式问题

时间:2010-11-24 05:59:20

标签: objective-c regex regexkitlite

开始一个新问题,因为我的另一个问题解决了正则表达式的另一个问题。

这是我的正则表达式:

(?i)\\d{1,4}(?<!v(?:ol)?\\.?\\s?)(?![^\\(]*\\))

为了清晰起见,正则表达式分裂:

(?i) - 不区分大小写

\\d{1,4} - 1-4位数字

(?<!v(?:ol)?\\.?\\s?)数字前面不能有'v','v。','vol','vol。',末尾有空格或没有空格。

(?![^\\(]*\\)) - 数字不能在括号内。

除了'vol。'之外,它都有效。位:

@"Words words 342 words (2342) (words 2 words) (words).ext"结果342 - 正确。

@"Words - words words (2010) (words 2 words) (words).ext"结果无 - 正确。

@"words words v34 35.ext"结果34 - 不正确。

@"Words vol.342 343 (1234) (3 words) (desc).ext"结果342 - 不正确。

我的'vol'我做错了什么部?

1 个答案:

答案 0 :(得分:2)

你需要在数字前加上lookbehind。此外,您需要在lookbehind中添加数字作为非法字符,或者4中的v.34将匹配。尝试

(?i)(?<!v(?:ol)?\\.?\\s*\\d*)\\d{1,4}(?![^(]*\\))

这是期待(编辑:错误的,事实证明)regexkitlite支持lookbehind内部的无限重复,这不是很多正则表达式的味道。

查看docs表明它确实支持lookbehind中的有限(但可变)重复,并且如果您知道以下内容仅在vol.之间最多有一个空格时才有效和数字,然后你可以尝试

(?i)(?<!v(?:ol)?\\.?\\s?)(?<!\\d)\\d{1,4}(?![^(]*\\))