30

我使用这个正则表达式在每个说第三个位置分割一个字符串:

String []thisCombo2 = thisCombo.split("(?<=\\G...)");

其中 G 后面的 3 个点表示每第 n 个要拆分的位置。在这种情况下,3 个点表示每 3 个位置。一个例子:

Input: String st = "123124125134135145234235245"
Output: 123 124 125 134 135 145 234 235 245.

我的问题是,我如何让用户控制字符串必须拆分的位置数?换句话说,我如何让这 3 个点,n 个点由用户控制?

4

5 回答 5

47

为了大幅提高性能,另一种方法是substring()在循环中使用:

public String[] splitStringEvery(String s, int interval) {
    int arrayLength = (int) Math.ceil(((s.length() / (double)interval)));
    String[] result = new String[arrayLength];

    int j = 0;
    int lastIndex = result.length - 1;
    for (int i = 0; i < lastIndex; i++) {
        result[i] = s.substring(j, j + interval);
        j += interval;
    } //Add the last bit
    result[lastIndex] = s.substring(j);

    return result;
}

例子:

Input:  String st = "1231241251341351452342352456"
Output: 123 124 125 134 135 145 234 235 245 6.

它不像stevevls 的解决方案那么短,但它的效率更高(见下文),我认为将来调整起来会更容易,当然这取决于你的情况。


性能测试 (Java 7u45)

2,000 个字符长的字符串 - 间隔为3

split("(?<=\\G.{" + count + "})")性能(以毫秒为单位):

7, 7, 5, 5, 4, 3, 3, 2, 2, 2

splitStringEvery()( substring()) 性能(以毫秒为单位):

2, 0, 0, 0, 0, 1, 0, 1, 0, 0

2,000,000个字符长的字符串 - 间隔为3

split()性能(以毫秒为单位):

207, 95, 376, 87, 97, 83, 83, 82, 81, 83

splitStringEvery()性能(以毫秒为单位):

44, 20, 13, 24, 13, 26, 12, 38, 12, 13

2,000,000个字符长的字符串 - 间隔为30

split()性能(以毫秒为单位):

103, 61, 41, 55, 43, 44, 49, 47, 47, 45

splitStringEvery()性能(以毫秒为单位):

7, 7, 2, 5, 1, 3, 4, 4, 2, 1

结论:

splitStringEvery()方法要快得多(即使在 Java 7u6 中的更改之后),并且当间隔变高时它会升级

即用型测试代码:

pastebin.com/QMPgLbG9

于 2012-09-06T09:41:38.940 回答
29

您可以使用大括号运算符指定字符必须出现的次数:

String []thisCombo2 = thisCombo.split("(?<=\\G.{" + count + "})");

大括号是一个方便的工具,因为您可以使用它来指定确切的计数或范围。

于 2012-09-06T08:18:13.600 回答
20

使用Google Guava,您可以使用Splitter.fixedLength()

返回一个拆分器,将字符串分成给定长度的片段

Splitter.fixedLength(2).split("abcde");
// returns an iterable containing ["ab", "cd", "e"].
于 2012-09-06T08:17:28.673 回答
0

如果要构建该正则表达式字符串,可以将拆分长度设置为参数。

public String getRegex(int splitLength)
{
    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < splitLength; i++)
        builder.append(".");

    return "(?<=\\G" + builder.toString() +")";
}
于 2012-09-06T08:17:57.203 回答
0
private String[] StringSpliter(String OriginalString) {
    String newString = "";
    for (String s: OriginalString.split("(?<=\\G.{"nth position"})")) { 
        if(s.length()<3)
            newString += s +"/";
        else
            newString += StringSpliter(s) ;
    }
    return newString.split("/");
}
于 2014-04-07T14:38:07.807 回答