从输入字符串获取标记的最简单方法是什么?

问题描述:

给定一个字符串从输入字符串获取标记的最简单方法是什么?

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

我该怎么做?

+3

这取决于你的令牌的定义。 – Raedwald

+0

见http://*.com/questions/11733500/getting-url-parameter-in-java-and-extract-a-specific-text-from-that-url从URL查询字符串得到实例的地图。 –

你是对的,首先与“&”分开,然后用“=”分开,当第二个分割在索引1处没有项目时,您知道没有任何值,您可以将其设置为emptyString。只需调试一个和另一个案例,你会找到正确的解决方案。

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

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

关于第二个问题(=后的默认值):为了简单起见,我后处理中的第二循环中的令牌阵列(结果),并检查是否=之后紧接着&或在端部,并且在这种情况下,插入件=令牌后的空字符串。

+0

我认为你的解决方案不起作用。如果一个密钥是'k1'会怎么样?然后标记器将它分成两个元素('k'和'​​1'),这是错误的。 – user3633595

+0

那么这种情况下,是不是你的问题的一部分... ...为什么你认为StreamTokenizer极将k和1之间的分裂?来自javadoc:“一个词汇标记由一个词组成,后面跟零个或多个单词组成或数字组成。” –