2016-12-08 13 views
0

私は、文字列を読み込み、異なるタイプの数値を抽出してグループ化する必要があります。ただし、これらの番号は任意の順序で表示されます。 たとえば、私には2種類の液体(毒性および無毒性)があります。文字列は、どちらのタイプのゼロからn回の間でも、保証されていない順序でも存在します。私は各タイプを要約することができるようにしたい。 例文字列が入力される:標準以外の注文で発生するパターンを見つけるためにregexを使用するにはどうすればよいですか?

:15ミリリットル毒性alkewagのグループを返すべき

非毒性の25ミリリットル非毒性lkjasdg 30ミリリットル毒性40ミリリットルabcdeljsdg

10ミリリットル毒性

毒性10ml、毒性15ml、毒性30ml、無毒性25ml、無毒性40ml

私はそれらを合計して合計55mlの毒性と65mlの非毒性を得ることができるようにしたいからです。

これをグループ化できる正規表現パターンを作成するにはどうすればよいですか?

私は使いこなしましたか?非貪欲であることが必要ですが、それは数値では機能しません。正規表現を使用することにより

答えて

0

あなたは、このようなグループにそれらをすることができます。結果は

String data = "10ml toxic abcdeljsdg 15 ml toxic alkewag 25 ml non-toxic lkjasdg 30ml toxic 40 ml non-toxic"; 
Pattern pattern= Pattern.compile("\\d+[\\s]?ml toxic"); 
Matcher matcher= pattern.matcher(data); 
while(matcher.find()) { 
    System.out.println(matcher.group()); 
} 

を次のようになります。

10ml toxic 
15 ml toxic 
30ml toxic 

あなたは、非毒性で同じことを行うことができます。その後、各グループの合計を計算し続けることができます。あなたが使用する必要があります

0

ザ・正規表現は

(\\d+(?=\\s*ml\\s*toxic))|(\\d+(?=\\s*ml\\s*non-toxic)) 

\\d+はなく、結果

\\s*ml\\s*toxic試合で試合に次の句が含まれて1

(?=)より大きい桁の任意の数と一致しますです任意の数のスペース、ml、任意の数のスペース、toxic

|

は、正規表現またはオペレータを表し、そう

|(\\d+(?=\\s*ml\\s*non-toxic))は、非毒性のボリュームを見つけるために添加することができます。

Matcher.group(1)には、式の左半分に一致する値が含まれ、右半分にはMatcher.group(2)が含まれます。

String pattern = "(\\d+(?=\\s*ml\\s*toxic))|(\\d+(?=\\s*ml\\s*non-toxic))"; 
String str = "10ml toxic abcdeljsdg 15 ml toxic alkewag 25 ml non-toxic lkjasdg 30ml toxic 40 ml non-toxic"; 

Pattern p = Pattern.compile(pattern); 
Matcher m = p.matcher(str); 

int sum1 = 0; 
int sum2 = 0; 
while(m.find()){ 
    if (m.group(1)!=null) 
     sum1 += Integer.parseInt(m.group(1)); 
    if (m.group(2)!=null) 
     sum2 += Integer.parseInt(m.group(2)); 
} 
System.out.println("Toxic = " + sum1); 
System.out.println("Non-Toxic = " + sum2); 

この意志出力

Toxic = 55 
Non-Toxic = 65 

そして

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
0

別の可能性をインポートすることを忘れないでください:

String data = "10ml toxic abcdeljsdg 15 ml toxic alkewag 25 ml non-toxic lkjasdg 30ml toxic 40 ml non-toxic"; 
Pattern pattern= Pattern.compile("(\\d+)[\\s]*(ml)\\s+((?:non-)?toxic)"); 
Matcher matcher= pattern.matcher(data); 
while(matcher.find()) { 
    System.out.println(matcher.group(1) + matcher.group(2) + " " + matcher.group(3)); 
} 

この意志出力:

10ml toxic 
15ml toxic 
25ml non-toxic 
30ml toxic 
40ml non-toxic 

あなたはまだmatcher.group(3)によって結果のグループに必要があります。

Map<String,List<String>> map = new HashMap<>(); 
Matcher matcher= pattern.matcher(data); 
while(matcher.find()) { 
    String value = matcher.group(1); 
    String unit = matcher.group(2); 
    String key = matcher.group(3); 
    List<String> list = map.get(key); 
    if (list == null) { 
     list = new ArrayList<>(); 
     map.put(key, list); 
    } 
    list.add(value + unit); 
} 
System.out.println(map); 

出力:

{toxic=[10ml, 15ml, 30ml], non-toxic=[25ml, 40ml]} 
関連する問題