簡體   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