2010-10-09 73 views

回答

6

为什么当你添加一个问号是因为你的第一组匹配greedily不工作的原因。尝试将其更改为一个非贪婪的比赛,然后让第二组可选:

^(A.*?)(ver\.\s\d{1,2})?$ 
    ^    ^
non-greedy  optional 

注意,在两个部分唯一的变化是增加了一个问号,但问号在各种情况下具有不同的含义。

另外,在您的示例中,文本ver.和版本号之间没有空格,因此您应该考虑在正则表达式中使可选空格为空。

请参阅Rubular上的正则表达式。

+1

此外,它可能是一个很好的想法逃离点 – 2010-10-09 21:12:01

+0

@Tim Pietzcker:+1是的,我没有发现原始正则表达式中的错误,现在修复。 – 2010-10-09 21:15:00

0

由于示例显示了两个单词(产品ID和版本信息)之间的空格,我期望设计一个正则表达式,它使用该空间来分隔各个部分。在Perl中:

$line =~ s/^(A\S+)\s+ver\.\s?\d{1,2}/$1/; 

这将删除(不捕获)版本;如果版本不存在,那么替换不会执行任何操作。

$line =~ s/^(A\S+)(?:\s+(ver\.\s?\d{1,2}))?/$1/; 

这是一个几乎微不足道的想法变化;它会捕获版本字符串(如果存在的话)(以及替换等)。注意版本字符串之前的空格包含在可选材料中但未捕获的微妙'(?:...)?',但版本信息捕获时没有前导空格。

报价在抽象的正则表达式,而不把他们绑Perl的情况下(虽然他们仍然使用PCRE - Perl兼容的正则表达式 - 符号),你可以写:

^(A\S+)(?:\s+(ver\.\s?\d{1,2}))? 
相关问题