2016-08-15 40 views
-1

我有一些字符串如下:什麼是字符串的正則表達式

String str = "Data[tableName=hello,schemaName=test,columns=[column[name=h1,key=true],column[name=h2,keys=false]]]"; 

如何劃分使用類似(正則表達式))的字符串,(,(),以獲得:

  1. 表名=你好
  2. SCHEMANAME =測試
  3. 列= [柱[名= H1,鍵=真],柱[名= H 2,=鍵假]]

這些列由至少出現一次的列組成。

+0

讓我猜猜 - Java的? –

+0

好吧,OP的問題歷史指向Python,但'String'指向其他langs ....不清楚。 –

+0

在嵌套結構上使用正則表達式不是最好的主意。 –

回答

1

假設Data[和最後]都或多或少固定的(比方說,Data是變量)中,我們可以使用replaceAll("^[^\\]\\[]+\\[|\\]$","")在開始後用[刪除這些值(所有這些都是不[]和一個]末)中,用以下的方法分析的其餘部分:

public static List<String> splitWithCommaOutsideBrackets(String input) { 
    int BracketCount = 0; 
    int start = 0; 
    List<String> result = new ArrayList<>(); 
    for(int i=0; i<input.length(); i++) { 
     switch(input.charAt(i)) { 
     case ',': 
      if(BracketCount == 0) { 
       result.add(input.substring(start, i).trim());// Trims the item! 
       start = i+1; 
      } 
      break; 
     case '[': 
      BracketCount++; 
      break; 
     case ']': 
      BracketCount--; 
      if(BracketCount < 0) 
       return result; // The BracketCount shows the [ and ] number is unbalanced 
      break; 
     } 
    } 
    if (BracketCount > 0) 
     return result; // Missing closing ] 
    result.add(input.substring(start).trim()); // Trims the item! 
    return result; 
} 

並使用它作爲

String input = "Data[tableName=hello,schemaName=test,columns=[column[name=h1,key=true],column[name=h2,keys=false]]]"; 
List<String> res = splitWithCommaOutsideBrackets(input.replaceAll("^[^\\]\\[]+\\[|\\]$","")); 
for (String t: res) { 
    System.out.println(t); // Printing the results 
} 

請參閱Java demo

+1

答案是如此詳細,通用和真正的效果,它可以適應各種不同的情況。 ! –

1

首先,你的描述應該更清楚。
假設字符串看起來像「Data [*,*,*]」,您可以通過正則表達式獲取「Data []」內的內容。現在你有「*,*,*」,String.split()是個好主意。

示例代碼:

String str = "Data[tableName=hello,schemaName=test,columns=[column[name=h1,key=true]]]"; 
String regex = "^Data\\[(.+)\\]$"; 
Matcher m = Pattern.compile(regex).matcher(str); 
if (m.find()) { 
    if (m.group(1) != null) { 
     String content = m.group(1); 
     String[] split = content.split(",", 3); 
     String tableName = split[0]; 
     String schemaName = split[1]; 
     String columns = split[2]; 
     System.out.println(tableName); 
     System.out.println(schemaName); 
     System.out.println(columns); 
    } 
} 

結果:

tableName=hello 
schemaName=test 
columns=[column[name=h1,key=true],column[name=h2,keys=false]] 
+0

感謝您的幫助,但我認爲WiktorStribiżew的答案更具有普遍性,可以適應隨機數量的列,並且列可以以字符串中的任何順序出現 –

+0

一旦另一個字符串類似'columns = [column [name = h1,key = true]]第一個論點,這種方法會失敗。 –