代码之家  ›  专栏  ›  技术社区  ›  nathanvda

与条件正则表达式作斗争

  •  5
  • nathanvda  · 技术社区  · 14 年前

    我有一个简单的问题,但我无法解决这个问题。 我的字符串有一个格式 ID: dddd ,使用以下正则表达式:

    /^ID: ([a-z0-9]*)$/
    

    或如下: ID: 1234 Status: 232 ,因此使用以下正则表达式:

    /^ID: ([a-z0-9]*) Status: ([a-z0-9]*)$/
    

    现在我想制作一个可以同时处理这两个问题的正则表达式。我想到的第一件事是:

    /^ID: ([a-z0-9]*)$|^ID: ([a-z0-9]*) Status: ([a-z0-9]*)$/
    

    它是匹配的,但是我正在研究条件正则表达式,并且在想应该可以沿着(伪代码)这一行做些什么。

    if the string contains /Status:/
        /^ID: ([a-z0-9]*)$/
    else
        /^ID: ([a-z0-9]*) Status: ([a-z0-9]*)$/
    

    只是,我不能正确表达。我想我应该用 /?=/ 但不知道怎么做。 类似的东西

    /((?=Status)^ID: ([a-z0-9]*) Status: ([a-z0-9]*)$|^ID: ([a-z0-9]*)$/
    

    但那不管用。

    你能帮忙吗?

    3 回复  |  直到 14 年前
        1
  •  7
  •   Community CDub    7 年前

    你在找 ^ID: (\d+)(?: Status: (\d+))?$

    编辑 : 既然这个问题被标记为Ruby,那么根据这两种情况,值得一提的是 this question this flavour-comparison ,Ruby不执行条件regex。

    http://www.regular-expressions.info 是这个主题的重要来源。

        2
  •  3
  •   Mark Byers    14 年前

    你需要一个 .* 展望未来: (Rubular)

    /(?=.*Status)^ID: ([a-z0-9]*) Status: ([a-z0-9]*)$|^ID: ([a-z0-9]*)$/
    

    但是,对于您的特定示例,您不需要提前查看。你只需使用 ? 量词代替: (Rubular)

    /^ID: ([a-z0-9]*)(?: Status: ([a-z0-9]*))?$/
    
        3
  •  2
  •   Community CDub    7 年前

    有趣的是,根据 this question ,Ruby 1.8/1.9不支持条件正则表达式。

    你(或任何回答者)读过其他的吗?如果是这样,更新链接的问题可能会有所帮助,这样它就不会再提供错误的信息。