2013-10-31 112 views
2

我有一個包含不同值/字符串的長字符串,我想提取。在java中使用正則表達式從長字符串中提取特定值或子字符串

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); 

我是新來的正則表達式。有沒有更聰明的方法來提取等號後面的數字/字符串?

我很感激任何建議!

+0

什麼是'[M] [L] [E] [A] [C] [=]'目的是什麼?如果你只想匹配一個特定的字符序列,你可以把它寫成'MLEAC =';不是一個大問題,但它會讓你的正則表達式更容易閱讀。 –

回答

5

我認爲你想要做的就是把你的String變成HashMap<String,String>

首先,你需要圍繞分號分割你的字符串。然後,重複獲得的數組,將等號周圍的每個條目分開,然後將結果添加到HashMap

我建議你閱讀String類的split方法,瞭解如何做到這一點,並閱讀有關HashMap類。看看http://docs.oracle.com/javase/7/docs/api/java/lang/String.htmlhttp://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html,如果您需要更多幫助,請再次發帖。

+0

對不起,我忘了提到字符串不總是相同的。可能缺少變量。 – Jujo

+0

@ByteCode對不起,我忘了提及字符串不總是相同的。可能缺少變量。所以我需要將它們分配給變量,如果它們在字符串中 – Jujo

+0

沒關係。 'HashMap'會存儲你給它的任何東西。當你稍後去檢索它們時,如果缺少一個條目,那麼當你試圖檢索它時,你會得到'null'。 –

0

你可以這樣做

String[] split = info.split(";"); 
for (String string : split) { 
     String[] split2 = string.trim().split("="); 
     System.out.println(split2[0] +" :" +split2[1]); 
} 
0

我不認爲正則表達式是一個好主意。嘗試info.split(";")[0].split("=")[1]以及一些額外的邊界檢查。

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對象來獲得它的值。

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 
相關問題