0

我遇到了以下问题,希望有人能告诉我是否使用了最糟糕的机制来实现我想要做的事情:

这是我需要解析的字符串:

(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);
     }
}

我也在尝试删除空格和回车,但是如果有更好的方法来做到这一点(显然我的方法不起作用),请告诉我。

4

4 回答 4

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));
}
于 2013-02-27T12:41:58.413 回答
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
于 2013-02-27T12:44:11.367 回答
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);
}
于 2013-02-27T12:53:22.677 回答
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));
    }
于 2013-02-27T12:55:46.530 回答