我有类似“AMS.I-I.D. ver.5
”和“AM0011 ver. 2
”的字符串,其中“ver. *
”需要被剥离。 我这样做了:(^A.*)(ver.\s\d{1,2})
将两个单词分成不同的单词串[但有时只有字符串中的单词...]
当没有像“AM0003
”这样的版本号时,就会出现问题。 如何使(ver.\s\d{1,2})
部件可选?
我有类似“AMS.I-I.D. ver.5
”和“AM0011 ver. 2
”的字符串,其中“ver. *
”需要被剥离。 我这样做了:(^A.*)(ver.\s\d{1,2})
将两个单词分成不同的单词串[但有时只有字符串中的单词...]
当没有像“AM0003
”这样的版本号时,就会出现问题。 如何使(ver.\s\d{1,2})
部件可选?
由于示例显示了两个单词(产品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}))?
此外,它可能是一个很好的想法逃离点 – 2010-10-09 21:12:01
@Tim Pietzcker:+1是的,我没有发现原始正则表达式中的错误,现在修复。 – 2010-10-09 21:15:00