“whitespace”&的字符串拆分`和`

时间:2014-03-27 05:14:20

标签: java string split

String filter = phoneNumber eq '763436' and  carrier eq 'AT and T Mobility' and site startswith '256'
分裂应该给我以下内容:

  

字符串1 = phoneNumber eq 763436

     

字符串2 =运营商eq' AT和T Mobility'

     

字符串3 =站点以256开始

更多字符串1 2和3应分成

  

String operator = phoneNumer String operator = eq String operand = 763436

     

String operator = carrier String operator = eq String operand = AT and T Mobility

     

String operator = site String operator = startswith String operand = 256

我可以分别使用string.split("和")和split("")分别用于外部和内部,但我的字符串也包含空格和(例如AT和T Mobility)。一个帮助是,只有在引号内的运算符中才会出现额外和空格。

任何帮助如何在java中拆分?

3 个答案:

答案 0 :(得分:2)

由于split是基于正则表达式的,如果我正确地阅读了这个问题,您可以将其拆分为:

String[] split = yourString.split("(and)|\s+");

修改

我会诚实地建议您自己解析字符串以获取特定的内容,而不是通过正则表达式进行拆分:

public String[] parseRawString(String raw) {
    List<String> args = new ArrayList<>();
    StringBuilder sb = new StringBuilder();
    //whether or not to split on spaces
    boolean inQuotes = false;
    for (char c : raw.toCharArray()) {
        //if a quote is found
        if (c == '\'') {
            inQuotes = !inQuotes;
        //if a space is found outside quotes
        } else if (char == ' ' && !inQuotes) {
            args.add(sb.toString());
            sb.clear();
        //if a normal character is found or we're inside a quote
        } else if (char != ' ' || inQuotes) {
            sb.append(c);
        }
    }
    //add any last remnants that weren't added before the end
    if (!sb.isEmpty()) {
        args.add(sb.toString());
    }
    return args.toArray(new String[args.size()]);
}

这样可以更轻松地解析:

String[] one = parseRawString("phoneNumber eq 763436");
/*
    one[0] = phoneNumber
    one[1] = eq
    one[2] = 763436
*/
String[] two = parseRawString("carrier eq 'AT and T Mobility'");
/*
    two[0] = carrier
    two[1] = eq
    two[2] = AT and T Mobility
*/
//etc...

我相信这似乎更接近你想要的东西。

答案 1 :(得分:0)

由于您希望将这些字符串作为键,操作数,值,您可以尝试使用

    String regex="(?<key>\\S+)\\s+(?<operator>\\S+)\\s+(?<value>'[^']*'|\\S+)";
    for(String s:filter.split("\\s*and\\s*(?=([^']*'[^']*')*[^']*$)"))
    {
        Matcher m=Pattern.compile(regex).matcher(s);
        while(m.find())
        {
            System.out.println("Key:"+m.group("key"));
            System.out.println("operator:"+m.group("operator"));
            System.out.println("Value:"+m.group("value"));
        }
    }

答案 2 :(得分:0)

查看此答案。 它的工作

<强>方案:

    String filter = "phoneNumber eq 763436 and  carrier eq 'AT and T Mobility' and site startswith 256";
    String[] split = filter.split("\\s*and\\s*(?=([^']*'[^']*')*[^']*$)");
    for (String s : split) {
       String[] split1 = s.trim().split(" ",3);
       for (String s1 : split1) {
            System.out.println(""+s1.replaceAll("'", ""));
        }
    }

<强>输出:

    phoneNumber
    eq
    763436
    carrier
    eq
    AT and T Mobility
    site
    startswith
    256

查看更新的程序,因为它适用于所有类型的输入字符串,如下所示

1.String filter =&#34;&#39;电话号码&#39; eq&#39; 763436&#39;和运营商eq&#39; AT和T Mobility&#39;和网站&#39;开始&#39; &#39; 256&#39;&#34 ;;

2.String filter =&#34;&#39;电话号码&#39; eq&#39; 763436&#39;和运营商eq&#39; AT和T Mobility&#39;和网站&#39;以&#39;开头&#39; 256&#39;&#34 ;;

3.String filter =&#34;&#39;电话和号码&#39; eq&#39; 763436&#39;和运营商eq&#39; AT和T Mobility&#39;和网站&#39;以&#39;开头&#39; 256&#39;&#34 ;;

4.String filter =&#34; phoneNumber eq&#39; 763436&#39;和运营商eq&#39; AT和T Mobility&#39;并且网站以&#39; 256&#39;&#34;;

开头

5.String filter =&#34; phoneNumber eq 763436 and carrier eq&quot; AT and T Mobility&#39;并且网站以256&#34;;

开头

你可以将更多的字符串与上面的字符串一起用作单引号。它们可以为所有字符串工作..

更新的计划

    String filter = "'phone Number' eq 763436 and  carrier eq 'AT and T Mobility' and site 'startswith' '256'";
    String[] split = filter.split("\\s*and\\s*(?=([^']*'[^']*')*[^']*$)");
    for (String s : split) {
        String[] split1 = s.trim().split("\\s* \\s*(?=([^']*'[^']*')*[^']*$)");
        for (String s1 : split1) {
            System.out.println("" + s1.replaceAll("'", ""));
        }
    }

<强>输出:

    phone Number
    eq
    763436
    carrier
    eq
    AT and T Mobility
    site
    startswith
    256

检查更新的代码并更新状态