【问题标题】:Java: splitting a comma-separated string but ignoring commas in parenthesesJava:拆分逗号分隔的字符串但忽略括号中的逗号
【发布时间】:2015-12-21 04:08:25
【问题描述】:

我有一个这样的字符串:

one,two,3,(4,five),six,(seven),(8,9,ten),eleven,(twelve,13,14,fifteen)

上面的字符串应该分成:

one
two
3
(4,five)
six
(seven)
(8,9,ten)
eleven
(twelve,13,14,fifteen)

【问题讨论】:

  • 你能发布更多代码吗?
  • 我会写一个非常简单的标记器/解析器。它会更灵活。我想您希望在括号中进一步拆分表达式:使用解析器,您可以一次构建整个树,并在必要时支持嵌套括号。
  • String str="一,二,3,(4,五),六,(七),(8,9,十),十一,(十二,13,14,十五)" ;字符串 [] tab = str.split(",");这是我的代码 java 但有问题
  • 我不知道使用 StringTokenizer .. 请帮忙...

标签: java regex string split


【解决方案1】:

我认为最简单的解决方案是逐字符处理输入字符串:

public static List<String> split(String input) {
    int nParens = 0;
    int start = 0;
    List<String> result = new ArrayList<>();
    for(int i=0; i<input.length(); i++) {
        switch(input.charAt(i)) {
        case ',':
            if(nParens == 0) {
                result.add(input.substring(start, i));
                start = i+1;
            }
            break;
        case '(':
            nParens++;
            break;
        case ')':
            nParens--;
            if(nParens < 0) 
                throw new IllegalArgumentException("Unbalanced parenthesis at offset #"+i);
            break;
        }
    }
    if(nParens > 0)
        throw new IllegalArgumentException("Missing closing parenthesis");
    result.add(input.substring(start));
    return result;
}

例子:

split("one,two,3,(4,five),six,(seven),(8,9,ten),eleven,(twelve,13,14,fifteen)") ->
[one, two, 3, (4,five), six, (seven), (8,9,ten), eleven, (twelve,13,14,fifteen)]

作为一项免费奖励,此解决方案还会在必要时计算嵌套括号:

split("one,two,3,(4,(five,six),seven),eight") ->
[one, two, 3, (4,(five,six),seven), eight]

它还检查括号是否平衡(每个左括号都有相应的右括号)。

【讨论】:

  • 最简单???我不会称之为“简单”。与this 比较:)
  • @Bohemian,在我看来,我的解决方案仍然是最简单的(可能不是最短的)。至少我从第一次尝试就编写了我的解决方案,并且它在第一次编译(包括嵌套括号计数)后工作,而你必须调试和修复你的代码。我不是代码中难以维护的正则表达式的忠实粉丝。
【解决方案2】:

对此有一个相对简单的单行解决方案:

String[] parts = input.split(",(?![^()]*\\))");

【讨论】:

    【解决方案3】:

    给你... :)

    import java.util.ArrayList;
    import java.util.List;
    import java.util.StringTokenizer;
    
    /**
     *
     * @author S1LENT W@RRIOR
     */
    public class Tokenizer {
    
        public static void main(String... args) {
    
            List<String> tokens = new ArrayList(); // List to store tokens
    
            String string = "one,two,3,(4,five),six,(seven),(8,9,ten),eleven,(twelve,13,14,fifteen)"; // input string
            StringTokenizer tokenizer = new StringTokenizer(string, "(),", true); // tokenize your string on the basis of these parentheses 
    
            while (tokenizer.hasMoreElements()) { // iterate over tokens
    
                String aToken = (String) tokenizer.nextElement(); // get a token
    
                if (aToken.equals("(")) { // if token is the begining of a parenthisis
                    StringBuilder sb = new StringBuilder(aToken);
                    String nextToken = (String) tokenizer.nextElement(); // get next token
                    while (!nextToken.equals(")")) { // iterate over next tokens untill you find the ending bracket
                        sb.append(nextToken);
                        nextToken = (String) tokenizer.nextElement();
                    }
                    sb.append(")");
    
                    tokens.add(sb.toString()); // add to tokens list
                } else if(aToken.equals(",")) { // need this to avoid adding commas
                    // do nothing
                } else {
                    tokens.add(aToken); // add to tokens list
                }
            }
    
            for(String aToken: tokens) { // print all tokens
                System.out.println(aToken);
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      使用正则表达式。

          String s = "one,two,3,(4,five),six,(seven),(8,9,ten),eleven,(twelve,13,14,fifteen)";
          Matcher m = Pattern.compile("[^,()]+|\\([^)]*\\)").matcher(s);
          while (m.find())
              System.out.println(m.group());
      

      【讨论】:

        猜你喜欢
        • 2010-12-17
        • 1970-01-01
        • 1970-01-01
        • 2018-04-14
        • 1970-01-01
        • 2017-04-07
        • 2015-03-07
        • 1970-01-01
        相关资源
        最近更新 更多