2016-12-23 82 views
0

我正在使用java正則表達式來匹配特定平臺。 例如,我的字符串列表是:在可選括號內匹配單個單詞

Ruby 2.1 (Puma) 
Ruby 2.3 (Passenger Standalone) 
Ruby 2.2 (Puma) 
Ruby 2.2 (Passenger Standalone) 
Ruby 1.9.6 

從這些我只想挑不屬於客運並且standlone的人。即。 Ruby 2.1(Puma)和Ruby 2.2(Puma)和Ruby 1.9.6。唯一的限制/條件是版本名稱,即Puma或Passenger Standalone是可選的。因此,括號和括號內的字符串是可選的

我嘗試使用下面的正則表達式:

"Ruby (.*)\s+\(?\w{0,1}\)?$" 

我有選項字符串的ArrayList。我的方法的代碼如下所示:

public void displayVersions(String platform) { 
    String regex = "Ruby (.*)\s+\(?\w{0,1}\)?$"; 
    List<String> availableVersions = getAvailableVersions(); 
    List<String> filtered = availableVersions.stream() 
     .filter(version -> version.matches(regex)) 
     .collect(Collectors.toList()); 

    System.out.println(filtered); 

}

的正則表達式是不正確的,我沒有得到正確的結果。我只有Passenger Standalone版本。我究竟做錯了什麼?

+2

爲什麼不只是'.filter(version - > version.indexOf(「Passenger Standalone」)<0)'? – 9000

回答

0

固定的正則表達式:Ruby ([0-9.]+)\s?\(?[^\s]*\)?$

你也可能需要添加/m選項,如果匹配字符串是多

我個人建議你https://regex101.com檢查和調試正則表達式。例如https://regex101.com/r/c148v8/2

+0

我正在使用regexr。也許這是在做一些挑剔的事情。但是這也不符合乘客獨立版本嗎?我猜想沒有限制嗎? – chrisrhyno2003

0

Ruby [0-9.]+ \((\S)\)

這將這樣的伎倆。

Ruby [0-9.]+相匹配的紅寶石版本

\((\S)\)括號內的任何非空白字符相匹配。