2014-06-23 37 views
0

我正在開發一個應用程序。用戶將在服務器中輸入一些設置值。當我通過內置的API向服務器請求價值時。我越來越像值作爲一個整體字符串:
的示例 -
以下場景的正則表達式匹配問題

name={abc};display={xyz};addressname={123} 

這裏的屬性名,顯示和地址,並有相應的值是ABC,XYZ和123
我用分裂;作爲第一個分度器,並且=作爲第二個計數器。

String[] propertyValues=iPropertiesStrings.split(";"); 
     for(int i=0;i<propertyValues.length;i++) 
     { 
      if(isNullEmpty(propertyValues[i])) 
       continue; 

      String[] propertyValue=propertyValues[i].split("="); 
      if(propertyValue.length!=2) 
       mPropertyValues.put(propertyValue[0], ""); 
      else 
       mPropertyValues.put(propertyValue[0], propertyValue[1]); 
     } 
    } 

這裏mPropertyValues是用於保存屬性名稱和值哈希映射。

問題是可能存在字符串:

case 1: name={abc};display={ xyz=deno; demo2=pol };addressname={123} 
case 2: name=;display={ xyz=deno; demo2=pol };addressname={123} 

我想HashMap來填充:

殼體1:

name ="abc" 
display = "xyz= demo; demo2 =pol" 
addressname = "123" 

對於殼體2:

name ="" 
display = "xyz= demo; demo2 =pol" 
addressname = "123" 

我正在尋找一個正則表達式來分割這些字符串;

+2

一組大括號中是否包含嵌套大括號?正如'name = {abc = {x}; xyz = {12}}'?如果是這樣,那麼語法是遞歸的,不是一個正則表達式解析的好候選。你需要編寫一個狀態機或遞歸下降解析器。 –

回答

0

假設有不能嵌套{}這應該做你需要什麼

String data = "name=;display={ xyz=deno; demo2=pol };addressname={123}"; 

Pattern p = Pattern.compile("(?<name>\\w+)=(\\{(?<value>[^}]*)\\})?(;|$)"); 
Matcher m = p.matcher(data); 

while (m.find()){ 
    System.out.println(m.group("name")+"->"+(m.group("value")==null?"":m.group("value").trim())); 
} 

輸出:

name-> 
display->xyz=deno; demo2=pol 
addressname->123 

說明

(?<name>\\w+)=(\\{(?<value>[^}]*)\\})?(;|$)可以分成幾部分,其中

  • (?<name>\\w+)=表示XXXX =並將其放置在XXXX命名name(的特性)
  • (\\{(?<value>[^}]*)\\})?是可選{XXXX}部分其中X不能}基。另外它會將XXXX部分放在名爲value的組中。
  • (;|$)表示數據的; OR端(由$錨表示)由於公式是name=value;或成對放置在數據name=value的端部的情況下。
0

以下正則表達式應符合您的條件,並使用命名的捕獲組來獲取您需要的三個值。

name=\{(?<name>[^}])\};display=\{(?<display>[^}]+)\};addressname=\{(?<address>[^}]\)} 
0

假設你的數據集可以改變的,更好的解析器可能會更有活力,從無論是在返回類型中建立一個Map

這個正則表達式是相當簡單的,因爲你在上面列出的情況下(沒有的{}嵌套,如其他人所說的):

Matcher m = Pattern.compile("(\\w+)=(?:\\{(.*?)\\})?").matcher(source_string); 
while (m.find()) { 
    if (m.groupCount() > 1) { 
     hashMap.put(m.group(1), m.group(2)); 
    } 
} 

有,但是,考慮到這一點:

  1. 如果m.group(2)不存在,「null」將是該值,(您可以使用少量邏輯調整它的值)。
  2. 這將考慮不同的數據集 - 以防將來的數據發生變化。

什麼是正則表達式的作用:

  1. (\\w+) - 這看起來爲一個或多個單詞字符的行(A-Z_),並將它們放入一個 「捕獲組」(group(1)
  2. = - 文字等於
  3. (?:...)? - 這使分組不是一個捕獲組(不會是.group(n),並且尾隨?使它成爲一個可選分組。
  4. \\{(.*?)\\} - 這個查找文字{}之間的任何東西(注意:如果有一個流浪}在那裏,這將會中斷)。如果此部分存在,則{}之間的內容將位於第二個「捕獲組」(.group(2))中。