2011-11-17 109 views
1

作爲輸入參數I可以有兩種類型的字符串:Java。正則表達式。如何解析?

codeName=SomeCodeName&codeValue=SomeCodeValue 

codeName=SomeCodeName 

而不codeValue

codeNamecodeValue是關鍵。

如何使用正則表達式來返回鍵的值?在這個例子中,它將只返回SomeCodeNameSomeCodeValue

+0

將您SomeCodeName和SomeCodeValue 可含有或=? –

回答

5

我不會打擾與正則表達式。帶有簡單標記('&','=')的String.split將完成這項工作。

String[] args = inputParams.split("&"); 
for (String arg: args) { 
    String[] split = arg.split("="); 
    String name = split[0]; 
    String value = split[1]; 
} 
+0

查看番石榴的'Splitter.MapSplitter' –

+0

+1,但我認爲你應該將'arg.split(「=」)''改爲'arg.split(「=」,2)',因爲允許等號查詢字符串參數的值。 – ruakh

+0

請注意,Argument to String.split是一個正則表達式 –

3

考慮使用番石榴的Splitter

String myinput = "..."; 
Map<String, String> mappedValues = 
      Splitter.on("&") 
        .withKeyValueSeparator("=") 
        .split(myinput); 
1

最簡單的方法是,首先分割源的字符串,然後打擊2份運行2個單獨的正則表達式。

Pattern pCodeName = Pattern.compile("codeName=(.*)"); 
Pattern pCodeValue = Pattern.compile("codeValue=(.*)"); 

String[] parts = str.split("\\&"); 
Matcher m = pCodeName.matcher(parts[0]); 
String codeName = m.find() ? m.group(1) : null; 

String codeValue = null; 
if (parts.length > 1) { 
    m = pCodeValue.matcher(parts[1]); 
    codeValue = m.find() ? m.group(1) : null; 
} 

}

但是,如果你願意,你也可以說:

Pattern p = Pattern.compile("codeName=(\\w+)(\\&codeValue=(\\w+))?"); 
Matcher m = p.matcher(str); 

String codeName = null; 
String codeValue = null; 

if (m.find()) { 
    codeName = m.group(1); 
    codeValue = m.groupCount() > 1 ? m.group(2) : null; 
} 
+0

IMO第二種選擇會更好,因爲它會更好更嚴格的比賽 –