0

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

这是我的正则表达式:

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

为清楚起见,正则表达式分开:

(?i)- 不区分大小写

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

(?<!v(?:ol)?\\.?\\s?)数字前面不能有“v”、“v.”、“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 - 不正确。

我的“卷”做错了什么 部分?

4

1 回答 1

2

您需要将lookbehind放在数字之前。此外,您需要在后视中添加数字作为非法字符,否则4inv.34将匹配。尝试

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

这是预期的(编辑:错误地,事实证明)regexkitlite 支持在lookbehind 内无限重复,而没有多少正则表达式风格可以做到这一点。

查看文档表明它确实支持在lookbehind内部进行有限(但可变)重复,如果您知道以下内容仅在vol.和数字之间最多有一个空格时才有效,那么您可以尝试

(?i)(?<!v(?:ol)?\\.?\\s?)(?<!\\d)\\d{1,4}(?![^(]*\\))
于 2010-11-24T06:54:05.033 回答