【问题标题】:How can I convert this positive lookbehind to a lookahead assertion?我怎样才能将这种积极的向后看转换为前瞻断言?
【发布时间】:2011-03-20 05:18:15
【问题描述】:

我在我的代码中使用以下正则表达式来验证选项符号:

^([A-Za-z]{1,5}\d? +\b(?<=^.{6}))[0-9]{6}[CcPp][0-9]{8}$

如果您注意到,我使用否定的后向断言来确认之前的匹配只有 6 个字符。

然而,JScript Regex 显然不支持后向查找,但它支持前瞻。

所以,我想如果我做了类似的事情:

^((?=^.{6})[A-Za-z]{1,5}\d? +\b)[0-9]{6}[CcPp][0-9]{8}$

这会起作用。

但是,它似乎没有以同样的方式限制它。在第一个示例中,说“我后面的匹配是 6 个字符长”很有用。但是,现在它是一个前瞻,这不起作用,因为即使它不在第一组中也会有 6 个字符匹配。

我正在使用的一些测试用例示例:

Should fail:
1GOOG 12E456C12345678
 GOOG 12E456C12345678
GE 4  12E456C12345678
GE4    12E456C12345678

Should pass:
GOOG1 123456C12345678
F5    123456C12345678

我怎样才能成功地将这个lookbehind转换成一个lookahead,以便我可以在javascript中使用这个表达式?

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    为什么不检查 5 个字符,然后是空格,然后是非空格?

    (?=.{5}\s\S)
    

    (或在完整模式的上下文中......)

    ^(?=.{5}\s\S)([A-Za-z]{1,5}\d? +\b)[0-9]{6}[CcPp][0-9]{8}$
    

    【讨论】:

    • 这将匹配GE 4 123456C12345678。误报。 4和1之间有两个空格。注释截断空格!
    • 不,它不会 - 因为实际模式(not 前瞻)不会匹配它。实际匹配模式中只有一个地方接受空格。
    • 看起来必须以1到5个字符后跟一个数字开头,所以他无法匹配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 2016-06-15
    相关资源
    最近更新 更多