我有類似「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