【问题标题】:String parsing mechansim to get values字符串解析机制以获取值
【发布时间】:2013-02-27 12:36:05
【问题描述】:

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

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

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

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

【问题讨论】:

标签: java regex string parsing expression


【解决方案1】:

这应该会有所帮助:

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

【讨论】:

    【解决方案2】:

    你可以试试这个:

    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
    

    【讨论】:

      【解决方案3】:
          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));
          }
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 这包括像[(j1), (j2), (f3), (f4), (f5), (g)]这样的括号,OP似乎想要[j1, j2, f3, f4, f5, g]
        • 是的,现在可以使用。不过,您的正则表达式似乎有点冗长。看看我的答案的正则表达式。不需要 2 个组,只需要一个匹配器。每次命中都需要一个新的匹配器;)
        • 不,你有我的 +1 来发布一个有效的解决方案。我只是发现我的效率更高,正则表达式更容易;)
        猜你喜欢
        • 1970-01-01
        • 2014-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-04
        相关资源
        最近更新 更多