2017-05-30 4 views
1

2つの-の間にあるすべての数字を抽出したいと思います。デリミネーター間の数字のみを抽出する方法は?

例:

test-555-2468-123 

抽出するために、所望の結果:[\d+]+を:

555 
2468 

次のように、私は正規表現を使用してみました。これは少なくともブロック内のすべての数字を私に与えます。しかし、どのようにして数字にプリフィックスとポストフィックスしなければならないという制限を-文字で追加することができますか?

それが重なってマッチを含むのであなたの正規表現で前後参照を使用することができます
+3

' - (\ d +) - 'を使用し、最初に取得したグループの値を抽出します。 – Tushar

+0

これは私に '555'を与えるだけです。しかし、私はすべてのグループが必要です。 – membersound

+0

すべてのグループを取得するために 'while(matcher.find())'を使用してください –

答えて

9

:Javaコードで

(?<=-)\d+(?=-) 

を:

final Pattern p = Pattern.compile("(?<=-)\\d+(?=-)"); 

RegEx Demo

  • (?<=-) - 正後方参照をそれが以前主張しますポジションにはハイフンが付きます
  • (?=-) - 肯定先読みは、次の位置は、これは少し正規表現を使用するソリューションであると(私は推測)より簡単ハイフン
+0

javaの正規表現とルックアサウトについて読むには良いソースですか? –

+1

ルックアラウンドのためにこれを読んでください:http://www.regular-expressions.info/lookaround.htmlそうでなければhttp://www.regular-expressions.info/は正規表現を学ぶためにたくさんのおいしさを持っています – anubhava

+1

ありがとうございました! :) –

0

を持って主張します。

String str = "test-555-2468-123"; 

// converting the split array into an array list 
ArrayList<String> list = new ArrayList<>(); 
Arrays.stream(str.split("\\-")).forEach(list::add); 

// ensure that there must be a "-" before and after by removing the first and last element 
list.remove(0); 
list.remove(list.size() - 1); 

// filter the elements that contains only numbers 
list.stream().filter(x -> Pattern.compile("\\d+").matcher(x).matches()).forEach(System.out::println); 
+1

なぜ正規表現パターンマッチャーが使用されていても、あらかじめ分割する必要がありますか? – membersound

+0

これはもっと簡単な解決策だと思っていました。splitを使って '='が両側に存在するようにしました。私はいつも読みにくい正規表現を見つけました。 @ mememsound – Sweeper

関連する問題