从输入String获取令牌的最简单方法是什么?

时间:2016-02-27 22:16:06

标签: java

给定一个字符串

abc=1&b=2&fa=_

我需要将其拆分以获取一系列令牌:

["abc", "=", "1", "&", "b", "=", "2", "&", "fa", "=" , "_"]

我的代码:

public String[] getTokens(String input) {
    List<String> list = new ArrayList<>();
    String[] splitted = input.split("&");

    for (int k = 0, splittedLength = splitted.length; k < splittedLength; k++) {
        String part = splitted[k];
        String[] kv = part.split("=");
        for (int i = 0, kvLength = kv.length; i < kvLength; i++) {
            String elem = kv[i];
            list.add(elem);
            if (i < kvLength - 1) {
                list.add("=");
            }
        }
        if (k < splittedLength - 1){
            list.add("&");
        }
    }

    return list.toArray(new String[list.size()]);
}

我还需要考虑我的密钥没有值(a =)的情况,在这种情况下我应该为我的密钥设置一个默认值 - 一个空字符串(a="")。

我该怎么做?

3 个答案:

答案 0 :(得分:0)

你是正确的方式,首先与&#34;&amp;&#34;并且使用&#34; =&#34;进行拆分,当第二个拆分在索引1处没有项目时,您知道没有值,您可以将其设置为emptyString。只需使用其中一个案例进行调试,您就会找到正确的解决方案。

答案 1 :(得分:0)

这是你试图解析的查询字符串,通常最简单的方法绝对不是自己编写,而是寻找执行这种简单任务的库。我可以建议https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/utils/URLEncodedUtils.html#parse(java.lang.String,%20java.nio.charset.Charset)

答案 2 :(得分:0)

为什么不使用java.io.StreamTokenizer:

public static String[] getTokens(String input) {
  try {
    ArrayList<String> result = new ArrayList<>();
    StreamTokenizer tokenizer = new StreamTokenizer(new StringReader(input));
    while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
      switch (tokenizer.ttype) {
        case StreamTokenizer.TT_WORD:
          result.add(tokenizer.sval);
          break;
        case StreamTokenizer.TT_NUMBER:
          result.add(String.valueOf(tokenizer.nval));
          break;
        default:
          result.add(String.valueOf((char) tokenizer.ttype));
      }
    }
    return result.toArray(new String[result.size()]);
  } catch (IOException e) {
    throw new RuntimeException(e);
  }
}

为示例返回值的Arrays.toString()输出:

[abc, =, 1.0, &, b, =, 2.0, &, fa, =, _]

关于第二个问题(=之后的默认值):为了简单起见,我会在第二个循环中对令牌数组(结果)进行后处理,并检查是否立即跟踪=通过&或最后,在这种情况下,在=令牌后插入一个空字符串。