2010-10-09 72 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}))? 
相關問題