繁体   English   中英

分割字符串而不会丢失分割字符

[英]Split string without losing split character

我想在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

可能吗?

使用正向后看

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

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

输出:

[123{, 456], 789[, 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*]

您可以使用零宽度向前/向后表达式来定义一个正则表达式,该正则表达式与目标字符之一和非目标字符之一之间的零长度字符串匹配:

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

将此表达式传递给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*]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM