有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

获取值的java字符串解析机制

我有以下问题,希望有人能告诉我,我是否使用了最糟糕的机制来实现我所尝试的目标:

下面是我需要解析的字符串:

(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) 个答案

  1. # 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));
        }
    
  2. # 2 楼答案

    只要不涉及严重的递归,正则表达式是一种简单的方法

    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);
    }
    
  3. # 3 楼答案

    你可以试试这个:

    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
    
  4. # 4 楼答案

    这将有助于:

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