2016-12-23 7 views
0

私は特定のプラットフォームに一致するようにjava正規表現を使用しています。 は例えば、文字列の私のリストは以下のとおりです。これらのことからオプションのかっこ内の1つの単語を一致させる

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がオプションであることです。私は文字列のArrayListのようなオプションを持っている

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

:私は、次の正規表現を使用しようとしています

ので、括弧と括弧内の文字列はオプションです。

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

固定正規表現:一致する文字列が複数行

である場合にも/mオプションを追加する必要があるかもしれませんRuby ([0-9.]+)\s?\(?[^\s]*\)?$

私は個人的には正規表現をチェックし、デバッグするためにあなたにhttps://regex101.comを示唆しています。例えばhttps://regex101.com/r/c148v8/2

+0

私はregexrを使用していました。たぶんそれは何か面倒なことをやっていたかもしれない。しかし、これは乗客のスタンドアロンバージョンにも一致しませんか?私が推測することに制限はありませんか? – chrisrhyno2003

0

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

これは、トリックを行います。

Ruby [0-9.]+はルビーバージョン

\((\S)\)は、括弧内の任意の非空白文字に一致する一致しました。

0

使用ネストされたoptionals:

^Ruby \d+(\.\d+)*(\(?\w+\)?)?$ 

live demoを参照してください。

関連する問題