2013-02-27 71 views
0

我有以下問題,並希望如果我使用的是最壞的可能機制,實現什麼都我試圖做有人能告訴我:字符串解析mechansim獲得價值

這裏是我的字符串,我需要解析:

(s(j1) | f(j2) | d(f3) | t(f4) | e(f5) = 5) & v(g) = "0" 

我需要能夠獲得J1,J2,F3,F4,F5和g,基本上什麼都括號內爲單獨的元件

下面是我在做什麼,它不是以我想要的方式工作......

String parsedString=""; 
String delimiter = "[()s(f(d(t(n(v(&|]+"); 
String[] tokens = parseString.split(delimiterString); 
List<String> listOfValues = new ArrayList<String>(Arrays.asList(tokens)); 
for (int i=0;i<listOfValues.size();i++) 
{ 
    System.out.println("Value of "+i+"is "+listOfValues.get(i)); 
    if(listOfValues.get(i).equals("\r") || listOfValues.get(i).equals("")|| listOfValues.get(i).equals(" ")) 
    { 
     listOfValues.remove(i); 
    } 
} 

我也試圖刪除空格和回車,但如果有更好的方法來做到這一點(顯然我的方式不工作),請讓我知道。

+0

僅供參考,這是一個非常好的網站與正則表達式http://www.regexplanet.com/advanced/java/index.html打試試'\(([^(] +?) \)'作爲正則表達式和您的字符串作爲輸入。 – 2013-02-27 12:46:14

回答

2

這應有助於:

String input = "(s(j1) | f(j2) | d(f3) | t(f4) | e(f5) = 5) & v(g) = \"0\""; 
String regex = "\\(([^(]+?)\\)"; 
Matcher matcher = Pattern.compile(regex).matcher(input); 
while (matcher.find()) { 
    System.out.println(matcher.group(1)); 
} 
+0

工作!謝謝! – user811433 2013-02-27 13:49:26

1

你可以試試這個:

Pattern p = Pattern.compile("[a-z]\\(([a-z0-9]+)\\)"); 
Matcher m = p.matcher(input); 
while (m.find()) { 
    System.out.println(m.group(1)); 
} 

與您的輸入使用時,返回此:

j1 
j2 
f3 
f4 
f5 
g 
1

一個正則表達式是一個簡單的方法只要沒有涉及嚴重的遞歸就行。

String s = "(s(j1) | f(j2) | d(f3) | t(f4) | e(f5) = 5) & v(g) = \"0\""; 

Pattern p = Pattern.compile("\\A.*?\\(([^\\(\\)][^\\(\\)]?)\\)(.*)\\z", Pattern.DOTALL); 
List<String> listOfValues = new ArrayList<String>(); 

Matcher m = p.matcher(s); 
while (m.matches()) 
{ 
    String toAdd = m.group(1); 
    System.out.println("adding = " + toAdd); 
    listOfValues.add(toAdd); 
    s = m.group(2); 
    m = p.matcher(s); 
} 
+0

這包括括號如[[(j1),(j2),(f3),(f4),(f5),(g )]',OP似乎想要'[j1,j2,f3,f4,f5,g]' – jlordo 2013-02-27 13:00:17

+0

是的,現在已經修復 – 2013-02-27 13:09:51

+0

是的,現在可以工作了,但是你的正則表達式看起來有點冗長。我的答案:不需要2個團隊,只需要一個匹配器,每個命中都需要一個新的匹配器;) – jlordo 2013-02-27 13:11:42

1
Pattern p = Pattern.compile("(?<=\\()[^()]+(?=\\))"); 
    Matcher m = p.matcher("(s(j1) | f(j2) | d(f3) | t(f4) | e(f5) = 5) & v(g) = \"0\""); 
    while (m.find()) { 
     System.out.println(m.group(0)); 
    }