2

抽出したいさまざまな値/文字列を含む長い文字列があります。

String info = "ABHom=1.00;AC=2;AF=1.00;AN=2;DP=24;Dels=0.00;FS=0.000;
              HaplotypeScore=0.9947;MLEAC=2;MLEAF=1.00;MQ=53.03;MQ0=0;QD=32.49;
              VQSLOD=2.70; culprit=FS";



Matcher matcher = Pattern.compile("[A][B][h][o][m][=]([0-9]+\\.[0-9]+)").matcher(info);
if (matcher.find()) {
    String someNumberStr = matcher.group(1);
        ABhom = Double.parseDouble(someNumberStr);

Matcher matcher = Pattern.compile("[M][L][E][A][C][=]/([0-9]+)").matcher(info);
if (matcher.find()) {
    String someNumberStr = matcher.group(1);
        MLEAC = Integer.parseInt(someNumberStr);

私は正規表現が初めてです。等号の後に数字/文字列を抽出するよりスマートな方法はありますか?

提案に感謝します!

4

5 に答える 5

5

あなたがしたいことは、あなたStringをに変えることだと思いますHashMap<String,String>

まず、文字列をセミコロンで分割する必要があります。次に、取得した配列を繰り返し、各エントリを等号で分割し、結果をHashMap.

これを行う方法については、クラスのsplitメソッドについて読むことをお勧めします。また、クラスについても読むことをお勧めします。http://docs.oracle.com/javase/7/docs/api/java/lang/String.htmlおよびhttp://docs.oracle.com/javase/7/docs/api/java/util/を参照してください。 さらにヘルプが必要な場合は、HashMap.htmlに移動して再度投稿してください。StringHashMap

于 2013-10-31T08:10:39.940 に答える
0

あなたはこのようにすることができます

String[] split = info.split(";");
for (String string : split) {
       String[] split2 = string.trim().split("=");
       System.out.println(split2[0] +" :" +split2[1]);
}
于 2013-10-31T08:13:18.140 に答える
0

次のように HashMap に格納できます。

String[] parts = info.split(";");
Map<String, String> hashMap = new HashMap<String, String>();
for (String s : parts) {
       String[] keyVal = s.trim().split("=");
       hashMap.put(keyVal[0], keyVal[1]);
}

後で、hashMap オブジェクトを使用してその値を取得できます。

于 2013-10-31T08:23:02.133 に答える
0

正規表現は良い考えではないと思います。info.split(";")[0].split("=")[1]追加の境界チェックを試してください。

于 2013-10-31T08:14:12.130 に答える
0
    String info = "ABHom=1.00;AC=2;AF=1.00;AN=2;DP=24;Dels=0.00;FS=0.000;"
            + " HaplotypeScore=0.9947;MLEAC=2;MLEAF=1.00;MQ=53.03;MQ0=0;QD=32.49;"
            + "VQSLOD=2.70; culprit=FS";

    Pattern pattern = Pattern.compile("(\\w+)=(\\d+(.\\d+)?)");
    Matcher matcher = pattern.matcher(info);
    while (matcher.find()) {            
        System.out.println("key: "+matcher.group(1) +" value: "+matcher.group(2));
    }

出力:

key: ABHom value: 1.00
key: AC value: 2
key: AF value: 1.00
key: AN value: 2
key: DP value: 24
key: Dels value: 0.00
key: FS value: 0.000
key: HaplotypeScore value: 0.9947
key: MLEAC value: 2
key: MLEAF value: 1.00
key: MQ value: 53.03
key: MQ0 value: 0
key: QD value: 32.49
key: VQSLOD value: 2.70

説明 :

\\w mean any character include _ \\w+ means array of characters
\\d mean any digit \\d+ means array of digits
? Matches the preceding element zero or one time. For example, ab?c matches only "ac" or "abc".

文字列と数字を抽出したいと言っていましたが、このため上記のコードでは抽出できませんculprit=FSが、すべてのペアを抽出したい場合は、次のコードを使用する必要があります。

    Pattern pattern = Pattern.compile("(\\w+)=([^;]+)");
    Matcher matcher = pattern.matcher(info);
    while (matcher.find()) {            
        System.out.println("key: "+matcher.group(1) +" value: "+matcher.group(2));
    }

出力:

key: ABHom value: 1.00
key: AC value: 2
key: AF value: 1.00
key: AN value: 2
key: DP value: 24
key: Dels value: 0.00
key: FS value: 0.000
key: HaplotypeScore value: 0.9947
key: MLEAC value: 2
key: MLEAF value: 1.00
key: MQ value: 53.03
key: MQ0 value: 0
key: QD value: 32.49
key: VQSLOD value: 2.70
key: culprit value: FS
于 2013-11-01T17:01:20.043 に答える