【问题标题】:Splitting Java string with quotation marks [duplicate]用引号分割Java字符串[重复]
【发布时间】:2011-08-09 23:05:10
【问题描述】:

可能重复:
Can you recommend a Java library for reading (and possibly writing) CSV files?

我需要在 Java 中拆分字符串。分隔符是空格字符。 字符串可能包含成对的引号(里面有一些文本和空格)——成对的引号内的整个正文应该被视为单个标记。 示例:

输入: 令牌1“令牌2”令牌3 输出:3 个元素的数组: 令牌1 令牌 2 令牌3

怎么做? 谢谢!

【问题讨论】:

  • 发布输入文本的示例,然后发布您期望收到的内容,这样可以减少解释空间。
  • -1,请参阅 edwardTheGreat 关于如何发布包含详细信息的问题的评论,这样我们就不必猜测您的确切要求。

标签: java csv


【解决方案1】:

拆分两次。首先是引号,然后是空格。

【讨论】:

  • -1,请解释一下它是如何工作的(一二“三四”五),我将删除我的反对票。我怀疑张贴者想要 4 个代币。第一个“一”,第二个“二”,第三个“三四”,第四个“五”。
  • 奇数标记将在引号内,所以不要用空格分隔它们。报价拆分产生“一二”、“三四”、“五”。仅拆分空格上的偶数标记,您会得到“一”、“二”、“三四”、“五”
  • 好点。但是 StringTokenizer 需要一个 returnDelims 标志。如果设置为 true,它将将分隔符作为标记返回,即 '"'。因此,当您从引号拆分中迭代标记时,如果遇到引号标记,那么您知道下一个标记是带引号的字符串。下一个之后的令牌将再次成为 '"',依此类推。
  • 解决方案并不像您原来的答案所建议的那么简单。您需要异常处理。但是,在您不必担心嵌入引号的简单情况下,它的效果相当好。我会发布一些我想出的代码。随意更改/删除代码。已删除反对票。
【解决方案2】:

假设其他解决方案对您不起作用,因为它们无法正确检测匹配的引号或忽略引用文本中的空格,请尝试以下操作:

private void addTokens(String tokenString, List<String> result) {
    String[] tokens = tokenString.split("[\\r\\n\\t ]+");
    for (String token : tokens) {
        result.add(token);
    }
}

List<String> result = new ArrayList<String>();
while (input.contains("\"")) {
    String prefixTokens = input.substring(0, input.indexOf("\""));
    input = input.substring(input.indexOf("\"") + 1);
    String literalToken = input.substring(0, input.indexOf("\""));
    input.substring(input.indexOf("\"") + 1);

    addTokens(prefixTokens, result);
    result.add(literalToken);
}

addTokens(input, result);

请注意,这不会处理不平衡的引号、转义的引号或其他错误/格式错误的输入情况。

【讨论】:

    【解决方案3】:
    import java.util.StringTokenizer; 
    class STDemo { 
        static String in = "token1;token2;token3"
    
        public static void main(String args[]) { 
    
            StringTokenizer st = new StringTokenizer(in, ";"); 
    
            while(st.hasMoreTokens()) { 
                String val = st.nextToken(); 
                System.out.println(val); 
            } 
        } 
    }
    

    这是字符串标记的简单方法

    【讨论】:

      猜你喜欢
      • 2011-03-26
      • 1970-01-01
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-30
      • 2013-01-27
      相关资源
      最近更新 更多