0

我正在尝试创建自己的拆分方法,该方法在输出中包含分隔符。到目前为止我有这个代码:

private static String[] split(String string, String regex) throws InterruptedException {
    ArrayList<String> output = new ArrayList<String>();
    String leftovers = string;

    if (regex.charAt(0) != '[' && regex.charAt(regex.length() - 1) != ']') {
        int i = 0;
        while (!leftovers.isEmpty()) {
            if (i == leftovers.indexOf(regex)) {
                if (!leftovers.substring(0, leftovers.indexOf(regex)).isEmpty()) {
                    output.add(leftovers.substring(0, leftovers.indexOf(regex)));
                }
                output.add(regex);
                leftovers = leftovers.substring(i + regex.length());
                i = 0;
            } else if (leftovers.indexOf(regex) == -1) {
                output.add(leftovers);
                leftovers = "";
            } else {
                i++;
            }
        }
    } else {
        char[] regexChars = new char[regex.length() - 2];
        for (int i = 0; i < regexChars.length; i++) {
            regexChars[i] = regex.charAt(i + 1);
        }

        int i = 0;

        for (int j = 0; j < regexChars.length; j++) {
            while (!leftovers.isEmpty()) {


                if (i == leftovers.indexOf(regexChars[j])) {
                    if (!leftovers.substring(0, leftovers.indexOf(regexChars[j])).isEmpty()) {
                        output.add(leftovers.substring(0, leftovers.indexOf(regexChars[j])));
                    }
                    output.add(Character.toString(regexChars[j]));
                    leftovers = leftovers.substring(i + 1);
                    i = 0;
                } else if (leftovers.indexOf(regexChars[j]) == -1) {
                    output.add(leftovers);
                    leftovers = "";
                } else {
                    i++;
                }
            }
        }
    }
    return output.toArray(new String[0]);

}       

我试图传入的输入参数是“a?b?gf#e”和“[?#]”。但是,我得到的输出是[a, ?, b, ?, gf, null, e]. 如果我将正则表达式中的分隔符反转为“[#?]”,我会得到[a, a?b?gf#e] 谁能告诉我我做错了什么?仅供参考,我不想使用 Pattern 和 Matcher 类,我们根本不允许使用内置的 split 方法。

4

2 回答 2

1

我不知道你为什么要创建自己的split()方法。您应该构建一个将分隔符作为单独的数组元素返回的正则表达式。将该正则表达式与现有split()方法一起使用。它会运作良好。

如果要在分隔符 - 上拆分[?#],同时将分隔符保留为单独的数组条目,则在这些分隔符之前和之后的空字符串上进行拆分。这将完成这项工作:

String str = "a?b?gf#e";        
String[] arr = str.split("(?<=[?#])|(?=[?#])");
System.out.println(Arrays.toString(arr));  // [a, ?, b, ?, gf, #, e]

解释:

(?<=[?#])   // Empty String preceded by `[?#]`
   |        // OR
(?=[?#])    // Empty String followed by `[?#]`
于 2013-10-10T17:19:27.863 回答
0

这是我的解决方案。它工作得很好它会忽略不属于拆分的任何内容。希望这对人有所帮助。如果您有任何问题,请告诉我。

public static String[] split(String str, String regex)
    {
        Vector<String> result = new Vector<String>();

    int start = 0;
    int pos = str.indexOf(regex);
    char[] charArray = new char[regex.length()];;

    if(regex.length() > 1){
        for(int i = 0; i< regex.length();i++){
            charArray[i] = regex.charAt(i);
        }
        for(char chars:charArray){
            {
                pos = str.indexOf(Character.toString(chars));
                while (pos>=start) {
                    if (pos>start) {
                        result.add(str.substring(start,pos));
                    }
                    start = pos + 1;
                    result.add(Character.toString(chars));
                    pos = str.indexOf(Character.toString(chars),start); 
                    System.out.println(pos);
                }
            }
        }
    }else{
        while (pos>=start) {
            if (pos>start) {
                result.add(str.substring(start,pos));
            }
            start = pos + regex.length();
            result.add(regex);
            pos = str.indexOf(regex,start); 
        }
        if (start<str.length()) {
            result.add(str.substring(start));
        }
    }
    String[] array = result.toArray(new String[0]);
    return array;
}
}
于 2015-11-03T00:42:16.517 回答