2011-05-10 25 views
4

比方說你有一個具有關鍵值,但這些變量後,它可以改變 前的字符串:有效的方式來解析字符串

KEY1=variable1, KEY2=variable2, KEY3=variable3 

我想知道的是什麼,是提取變量1的最佳方式,變量2和變量3。如果我知道每個子字符串,並且每次都得到它,那將會很好,但是我不會改變這些變量。請注意,密鑰不會更改

+0

http://stackoverflow.com/questions/5887559/best-way-to-retrieve-a-value-from-a-string-java/5887890#5887890的可能的複製 – 2011-05-10 12:38:35

回答

1

如果變量值不能包含逗號或空格,則可以簡單地將字符串拆分爲使用「,」作爲拆分標記的數組。然後你可以在等號上進一步拆分每個鍵以檢索鍵和值。

5

你可以試試這個:

String str = "KEY1=variable1, KEY2=variable2, KEY3=variable3"; 
String[] strArr = str.split(","); 
String[] strArr2; 
for (String string : strArr) { 
    System.out.println(string); // ---- prints key-value pair 
    strArr2 = string.trim().split("="); 
    System.out.println(strArr2[1]); // ---- prints value 
} 
2

的變化對哈利的解決辦法,處理周圍的空間,並在=值。

String str = "KEY1=variable1, KEY2=variable2, KEY3=variable3 , a = b=1, c"; 
Map<String, String> map = new LinkedHashMap<String, String>(); 
for (String string : str.trim().split(" *, *")) { 
    String[] pair = string.split(" *= *", 2); 
    map.put(pair[0], pair.length == 1 ? null : pair[1]); 
} 
System.out.println(map); 

打印

{KEY1=variable1, KEY2=variable2, KEY3=variable3, a=b=1, c=null} 
2

如果你想成爲超高效,沒有不必要的對象創建,或逐個字符迭代,你可以使用indexOf這比性格更有效的字符循環爲大子。

public class ValueFinder { 
    // For keys A, B, C will be { "A=", ", B=", ", C=" } 
    private final String[] boundaries; 

    /** 
    * @param keyNames To parse strings like {@code "FOO=bar, BAZ=boo"}, pass in 
    *  the unchanging key names here, <code>{ "FOO", "BAZ" }</code> in the 
    *  example above. 
    */ 
    public ValueFinder(String... keyNames) { 
    this.boundaries = new String[keyNames.length]; 
    for (int i = 0; i < boundaries.length; ++i) { 
     boundaries[i] = (i != 0 ? ", " : "") + keyNames[i] + "="; 
    } 
    } 

    /** 
    * Given {@code "FOO=bar, BAZ=boo"} produces <code>{ "bar", "boo" }</code> 
    * assuming the ctor was passed the key names <code>{ "FOO", "BAZ" }</code>. 
    * Behavior is undefined if {@code s} does not contain all the key names in 
    * order. 
    */ 
    public String[] parseValues(String s) { 
    int n = boundaries.length; 
    String[] values = new String[n]; 
    if (n != 0) { 
     // The start of the next value through the loop. 
     int pos = boundaries[0].length(); 
     for (int i = 0; i < n; ++i) { 
     int start = pos; 
     int end; 
     // The value ends at the start of the next boundary if 
     // there is one, or the end of input otherwise. 
     if (i + 1 != n) { 
      String next = boundaries[i + 1]; 
      end = s.indexOf(next, pos); 
      pos = end + next.length(); 
     } else { 
      end = s.length(); 
     } 
     values[i] = s.substring(start, end); 
     } 
    } 
    return values; 
    } 
} 
相關問題