2017-07-12 172 views
0

我想從一個長字符串中提取2個特定的數據段。這兩個值都後「=」,但問題是我不能僅僅只是劈在每一個「=」,因爲一些數據,我需要包含這些以及數據:試圖將多個字符串解析爲1字符串

example: "{col1=RND393JKDN, col2=DJW//39ndo==8} 
desired format: "RND393JKDN, DJW//39ndo==8" 

下面是代碼我已經寫來解決這樣做,但另一件是,我不確定有多少列將被輸入的,所以我必須能夠處理列的未知量,如:"{col1=value1, col2=value2, col3=value3}"

for(int i = 0; i < finalResult.size(); i+=modval) { 
    //below forces the result to get stored in below variable as a String type 
    String resulttemp = finalResult.get(i).toString(); 

    //below is only for 
    for(int z = 0; z < columnHeaders.size(); z++) { 
     String newStr=finalResult.get(i).replaceAll("\\[", "").replaceAll("\\]", "").replaceAll("\\{", "").replaceAll("\\}", ""); 

     String newStr2; 
     String newStr3; 

     String find = "="; 

     newStr = (newStr.substring(newStr.indexOf(find)+find.length())); 
     newStr2 = (newStr.substring(newStr.indexOf(find)+find.length())); 
     newStr3 = (newStr2.substring(newStr.indexOf(find)+find.length())); 

     pw.printf("%s\n", newStr, newStr3); 
    } 
} 
+0

也許查找模式'col1 =(? [^,] +)'(對每個col重複)以及之後的concat。 –

+1

replaceAll接受一個正則表達式,那麼爲什麼不使用一個字符類而不是將方法鏈接在一起? –

+0

@ cricket_007我最初使用replaceAll,因爲你提到,但它沒有正常工作。這只是一個膠帶修補程序,爲了解決我的問題 – dgelinas21

回答

1

如果可能的話,可以考慮改變輸入格式。如果不是,這是一種天真而簡單的方法。

import java.util.List; 
import java.util.ArrayList; 



public class HelloWorld 
{ 
    public static void main(String[] args) 
    { 
    String s = "{col1=RND393JKDN, col2=DJW//39ndo==8}"; 
     s=s.substring(1, s.length()-1); //remove {} 
     s.replaceAll(" ", ""); 
     String[] explode = s.split(","); 
     List<String> result = new ArrayList<String>(); 
     for (int i=0; i<explode.length; i++) { 
      String keyAndValue = explode[i]; 
      int at = keyAndValue.indexOf("="); 
      String value = keyAndValue.substring(at+1); 
      result.add(value); 
     } 
     String finalResult = ""; 
     for (String val : result) { 
      finalResult+=val+", "; 
     } 
     finalResult=finalResult.substring(0, finalResult.length()-2); 
     System.out.println(finalResult); 
    } 
} 

基本上,分成key + value標記,找到first = char並從那裏獲取值。夠簡單。除非有其他一些意想不到的格式規則。我希望空間和逗號不會出現在關鍵和價值中。

+0

是的,我的輸入實際上來自已經填充的源系統,所以我無法控制格式和衛生。不幸的是,這個解決方法是必需的 – dgelinas21

+0

當一個colx包含空白時,您的代碼將刪除這些字符。如果col內容必須保持不變,這可能會成爲OP的問題。 –

+0

的確,根據輸入格式,OP應該進行更多的邊界和衛生檢查。 – cen

0

構建你自己列出了=的職位。根據你需要多少,建立子串(你已經這樣做了)。

+0

當你的值爲等號時,我認爲這不會有幫助 –

+0

@kleopi他無法知道哪一個等於值如果他這樣做 – Nathan

0

我會用逗號原字符串分割,然後更換什麼是在=面前:

public static void main(String[] args) { 
    String f = "{col1=RND393JKDN, col2=DJW//39ndo==8}"; 
    String[] fs = f.replaceAll("^\\{|}$", "").split(","); 
    String[] res = new String[fs.length]; 

    for (int i = 0; i < fs.length; i++) { 
     res[i] = fs[i].replaceAll("\\s?col\\d+=", ""); 
    } 
    System.out.println(String.join(", ", res)); // RND393JKDN, DJW//39ndo==8 
} 
1

正則表達式是一件美妙的事情。下面是一個例子,說明如何使用Java的內置MatcherPattern類以簡單的方式完成您需要的內容。

public static void main(String[] args) 
{ 
    String input = "{col1=RND393JKDN, col2=DJW//39ndo==8}"; 
    //Remove the {} 
    str = str.substring(1, str.length() - 1); 
    //Match "col", then any number, then an = sign, 
    //then capture everything from the = to the , as "content" 
    Pattern p = Pattern.compile("col\\d+=(?<content>[^,]+)"); 
    Matcher m = p.matcher(str); 
    //The target string. 
    String out = ""; 
    //While a match for the pattern exists, i.e. do for all matches of the pattern. 
    while (m.find()) 
    { 
     //String together desired parts into the output string, separated by ", " 
     out += m.group("content") + ", "; 
    } 
    //Remove trailing ", " 
    out = out.substring(0, out.length() - 2); 
}