2014-07-02 118 views
2

我的Java程序,在某些點上,接收包含像本實施例中一對夫婦鍵值屬性的字符串:這種模式的正則表達式是什麼?

param1=value Param2=values can have spaces PARAM3=values cant have equal characters 

的參數名稱/鍵由單個字(AZ,AZ,由_和0-9),然後是=字符(不能用空格分隔)並且是值。該值是一個可以包含空格的文本,並且可以一直保留到字符串的結尾或另一個參數的開頭。 (這是一個字,後跟equals和它的值等)

我需要從此字符串中提取Properties對象(字符串到字符串映射)。我試圖使用正則表達式來查找每個鍵值集。代碼是這樣的:

public static String createProperties(String str) { 
    Properties prop = new Properties(); 
    Matcher matcher = Pattern.compile(some regex).match(str); 

    while (matcher.find()) { 
     String match = matcher.group(); 
     String param = ...; // What comes before '=' 
     String value = ...; // What comes after '=' 
     prop.setProperty(param, value); 
    } 

    return prop; 
} 

但是,正則表達式寫不工作。

String regex = "(\\w+=.*)+"; 

由於.*告訴正則表達式得到「任何東西」,它發現,它會匹配整個字符串。我想告訴正則表達式搜索,直到找到另一個\\w=.*。 (字後跟等於和之後的東西)

我怎麼能寫這個正則表達式?或者,使用正則表達式的問題的另一種解決方案是什麼?

回答

4

您可以在這裏使用Negative Lookahead

(\\w+)=((?:(?!\\s*\\w+=).)*) 

密鑰置於內捕獲組#1並且該值是在捕獲組#2。請注意,我在查找範圍內使用了\s,以防止該值具有拖尾空格。

Live Demo

+0

完美!非常感謝你。我不知道要使用負向預測,我會學習以更好地理解正則表達式。 –

1

一箇中的幾個方式:

List<String> paramNames = new ArrayList<String>(); 
List<String> paramValues = new ArrayList<String>(); 
Pattern regex = Pattern.compile("([^\\s=]+)=([^\\s=]+)"); 
Matcher regexMatcher = regex.matcher(subjectString); 
while (regexMatcher.find()) { 
     paramNames.add(regexMatcher.group(1)); 
     paramValues.add(regexMatcher.group(2)); 
    } 

正則表達式:

([^\\s=]+)=([^\\s=]+) 

的代碼檢索鍵作爲第1組,值作爲第2組。

說明

  • ([^\\s=]+)捕獲不是一個空白或等於第1組
  • =匹配的字面=
  • ([^\\s=]+)任何字符捕獲不是一個空白或任何字符等於組2
1

你的r egex將是,

(\\w+=(?:(?!\\w+=).)*) 

DEMO

它捕獲的param=value對高達下一param=。它將三個param=value對捕獲到三個獨立的組中。

說明:

  • \\w+=匹配的一個或多個單詞的字符,隨後一個=符號。
  • (?:(?!\\w+=).)*一個非捕獲組和一個負向前視用於匹配這個\w+=格式中的字符而不是字符。所以它捕捉到下一個param=