2013-02-27 81 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)); 
    }