3 回答

TA貢獻1898條經(jīng)驗 獲得超8個贊
這應該這樣做:
String[] split = myString.split("(?=(....)+$)");
// or
String[] split = myString.split("(?=(.{4})+$)");
它的作用是:僅當空字符串前面有 4 個字符的倍數(shù)時才拆分空字符串,直到到達輸入結(jié)束。
當然,這有一個糟糕的運行時間 (O(n^2))。您只需自己拆分即可獲得線性運行時間算法。
正如@anubhava 所提到的:
(?!^)(?=(?:.{4})+$)如果字符串長度是 4 的倍數(shù),以避免出現(xiàn)空結(jié)果

TA貢獻1836條經(jīng)驗 獲得超3個贊
正則表達式對此真的是不必要的。我也不認為這對遞歸來說是一個好問題。下面是一個 O(n) 的解決方案。
public static String[] splitIt(String input, int splitLength){
int inputLength = input.length();
ArrayList<String> arrayList = new ArrayList<>();
int i = inputLength;
while(i > 0){
int beginIndex = i - splitLength > 0 ? i - splitLength : 0;
arrayList.add(0, input.substring(beginIndex, i));
i -= splitLength;
}
return arrayList.toArray(new String[0]);
}

TA貢獻1876條經(jīng)驗 獲得超6個贊
無需使用正則表達式。相反,您可以遞歸地構(gòu)建頭部字符串列表并返回尾部。
import java.util.*;
public class StringChunker {
public static void main(String[] args) {
String str = "abcdefghijklm";
System.out.println(Arrays.toString(chunk(str, 4))); // [abcd, efgh, ijkl, m]
System.out.println(Arrays.toString(chunk(str, 4, true))); // [a, bcde, fghi, jklm]
}
public static String[] chunk(String str, int size) throws IllegalArgumentException {
return chunk(str, size, false);
}
public static String[] chunk(String str, int size, boolean reverse) throws IllegalArgumentException {
return chunk(str, size, reverse, new ArrayList<String>());
}
private static String[] chunk(String str, int size, boolean reverse, List<String> chunks) throws IllegalArgumentException {
if (size < 1) {
throw new IllegalArgumentException("size must be greater than 0");
}
if (str.length() < size) {
if (reverse) {
chunks.add(0, str); // Reverse adds to the front of the list
} else {
chunks.add(str); // Add to the end of the list
}
return chunks.toArray(new String[chunks.size()]); // Convert to an array
} else {
String head, tail;
if (reverse) {
head = str.substring(str.length() - size, str.length());
tail = str.substring(0, str.length() - size);
chunks.add(0, head);
} else {
head = str.substring(0, size);
tail = str.substring(size);
chunks.add(head);
}
return chunk(tail, size, reverse, chunks);
}
}
}
添加回答
舉報