【问题标题】:Regex issue using ICU regex/regexkitlite使用 ICU regex/regexkitlite 的正则表达式问题
【发布时间】:2010-11-24 05:59:19
【问题描述】:

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

这是我的正则表达式:

(?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.' 做错了什么部分?

【问题讨论】:

    标签: objective-c regex regexkitlite


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 恐怕不行。另外,在我提出的最后一个问题上,有人说后面应该在数字之后。现在我不知道该怎么想!
    • 嗯,一个lookbehind断言从字符串中的当前位置向后看,所以如果你把它放在数字之后,它会查看数字并看到它是't vol. 或类似的东西。这个正则表达式在 RegexBuddy 中工作;但很可能 regexkitlite 不支持后向断言中的无限甚至可变重复(如果它完全支持它们,像 JavaScript 这样的一些语言不知道后向...)。
    • 我刚刚查看了docs,根据我在那里的发现,第二个正则表达式应该可以工作。哦!我只是意识到我忘了逃避反斜杠!将编辑。
    • (?i)(?&lt;!v(?:ol)?\\.?\\s?)(?&lt;!\\d)\\d{1,4}(?![^\\(]*\\)) 是最终的正则表达式 - 但它仍然失败。如果我取出前瞻,它会拾取非“卷”。东西正确。如果我去掉后视,括号内的位就可以了。愤怒上升!
    • @Nick:天啊。我想我发现了另一个问题。当我昨天编辑我的答案时,已经很晚了,所以我忽略了前瞻中未转义的反斜杠。不过,您不必转义字符类中的括号。所以现在我(希望)通过再次编辑我的答案来完成正则表达式。很抱歉造成混乱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多