【问题标题】:What is the easiest way to get tokens from input String?从输入字符串中获取令牌的最简单方法是什么?
【发布时间】:2016-02-27 22:16:05
【问题描述】:

给定一个字符串

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="")。

我该怎么做?

【问题讨论】:

标签: java


【解决方案1】:

你走对了,首先用“&”分割,然后用“=”分割,当第二个分割在索引 1 处没有项目时,你知道没有值,你可以将它设置为 emptyString .只需调试一种情况和另一种情况,您就会找到正确的解决方案。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      为什么不直接使用 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, =, _]
      

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

      【讨论】:

      • 我认为您的解决方案不起作用。如果密钥是k1 怎么办?然后分词器会将其拆分为两个元素(k1),这是错误的。
      • 那么这个案例不是你的问题的一部分......为什么你认为 StreamTokenizer 会在 k 和 1 之间分裂?来自 javadoc:“单词标记由一个单词成分组成,后跟零个或多个单词成分或数字成分。”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 2019-04-21
      • 2020-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多