与条件正则表达式斗争

时间:2010-08-23 15:09:37

标签: ruby regex

我有一个简单的问题,但我无法解决这个问题。 我的字符串格式为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 个答案:

答案 0 :(得分:7)

您正在寻找^ID: (\d+)(?: Status: (\d+))?$

修改: 由于问题标记为Ruby,因此根据两者都值得一提 this questionthis flavour-comparison,Ruby不执行条件正则表达式。

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

答案 1 :(得分:3)

您的前瞻需要.*(Rubular)

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

但是,对于您的具体示例,您不需要前瞻。您只需使用?量词:(Rubular)

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

答案 2 :(得分:2)

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

您(或任何回答者)是否以其他方式阅读?如果是这样,更新链接的问题可能会有所帮助,以便它不再提供不正确的信息。