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

时间:2015-01-11 20:59:21

标签: java regex string split

我想在Java中将一个字符串拆分成这样的字符串,普通的split函数在丢失拆分字符时拆分字符串:

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

有可能吗?

4 个答案:

答案 0 :(得分:1)

使用positive lookbehind

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

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

输出:

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

答案 1 :(得分:0)

我认为你正在寻找像

这样的东西
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*]

答案 2 :(得分:0)

您可以使用零宽度前瞻/后方表达式来定义一个正则表达式,该表达式匹配一个目标字符与任何不是您的目标字符之间的零长度字符串: / p>

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

将此表达式传递给String.split

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

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

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

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

答案 3 :(得分:0)

您可以使用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*]