拆分字符串而不丢失拆分字符

Split string without losing split character

我想像这样拆分 Java 中的某个字符串,普通拆分函数拆分字符串时会丢失拆分字符:

String = "123{456]789[012*";

我想拆分 {,[,],* 个字符的字符串,但又不想丢失它们。我的意思是我想要这样的结果:

part 1 = 123{
part 2 = 456]
part 3 = 789[
part 4 = 012*

通常拆分函数是这样拆分的:

part 1 = 123
part 2 = 456
part 3 = 789
part 4 = 012

可能吗?

我想你正在寻找类似

的东西
String str = "123{456]789[012*";
String[] parts = new String[] {
        str.substring(0,4), str.substring(4,8), str.substring(8,12),
        str.substring(12)
};
System.out.println(Arrays.toString(parts));

输出是

[123{, 456], 789[, 012*]

您可以使用零宽度 lookahead/behind 表达式来定义匹配零长度字符串的正则表达式 您的目标字符之一和任何不是您的目标角色之一:

(?<=[{\[\]*])(?=[^{\[\]*])

将此表达式传递给 String.split:

String[] parts = "123{456]789[012*".split("(?<=[{\[\]*])(?=[^{\[\]*])");

如果你有一个连续的分隔符块,这将在整个块的末尾拆分一次,即字符串 "123{456][789[012*" 将拆分为四个块 "123{", "456][", "789[", "012*"。如果您只使用了第一部分(回顾)

(?<=[{\[\]*])

那么你会得到五个部分"123{", "456]", "[", "789[", "012*"

您可以使用 PatternMatcher 来查找拆分字符和拆分字符本身之后的下一个索引。

public static List<String> split(String string, String splitRegex) {
    List<String> result = new ArrayList<String>();

    Pattern p = Pattern.compile(splitRegex);
    Matcher m = p.matcher(string);
    int index = 0;
    while (index < string.length()) {
        if (m.find()) {
            int splitIndex = m.end();
            String splitString = m.group();
            result.add(string.substring(index,splitIndex-1) + splitString);
            index = splitIndex;
        } else
            result.add(string.substring(index));
    }
    return result;
}

示例代码:

public static void main(String[] args) {
    System.out.println(split("123{456]789[012*","\{|\]|\[|\*"));
}

输出:

[123{, 456], 789[, 012*]

使用 positive lookbehind:

(?<={|\[|\]|\*)

String str = "123{456]789[012*";
String parts[] = str.split("(?<=\{|\[|\]|\*)");
System.out.println(Arrays.toString(parts));

输出:

[123{, 456], 789[, 012*]