在java中将字符串划分为子字符串

在java中将字符串划分为子字符串,java,arrays,string,substring,Java,Arrays,String,Substring,我有一个字符串1122333344555566778888 我需要对它进行子串,结果得到[11,22,3333,44,5555,66,77,8888] 有没有可能用一种漂亮的方式来做这件事,或者我需要硬编码并八次使用string.substring(开始、结束)函数,然后放入数组 编辑:字符串不仅可以包含重复的数字AB CG KJ 98HQ 0K 1E OOQW它也是一个示例 您可以使用重复字符的正则表达式: String input = "1122333344555566778888"; St

我有一个字符串
1122333344555566778888
我需要对它进行子串,结果得到
[11,22,3333,44,5555,66,77,8888]
有没有可能用一种漂亮的方式来做这件事,或者我需要硬编码并八次使用
string.substring(开始、结束)
函数,然后放入
数组


编辑:字符串不仅可以包含重复的数字<代码>AB CG KJ 98HQ 0K 1E OOQW它也是一个示例

您可以使用重复字符的正则表达式:

String input = "1122333344555566778888";
String regex = "(\\w)\\1+";

Matcher m = Pattern.compile(regex).matcher(input);
String[] substrings = new String[input.length()];

int index = 0;

while (m.find())
    substrings[index++] = m.group();

for (int i = 0; i < index; i++)
    System.out.println(substrings[i]);
重要提示:

11
22
3333
44
5555
66
77
8888
    [AAA, BBB, CCC]
var str="1122333344555566778888"; //whatever
b=0;outpt="";
while(b<=18){
if(b==4|b==10|b==18){e=4;p=4}else{e=2;p=2}
outpt+=str.substr(b,e)+", ";b+=p;}
alert(outpt);
11, 22, 3333, 44, 5555, 66, 77, 8888, 

子字符串
数组包含空项,因为其长度等于输入字符串的长度。如果字符串包含非重复序列字符,则此数组可能没有空项。注意
子字符串
中的
NullPointerException

此字符串中没有可以使用的分隔符。split()。。。等,它将很容易使用

String[] splits = asseltClasses.split("-");
使用以下模式:
(\d)\2*)

产生:

11
22
3333
44
5555
66
77
8888

编辑:如果其数字以及空格和字母使用基于BlueBullet的模式
([\d\w\s])\2*)

import java.util.regex.*;
import java.util.*;
public class MyTest {

    public static void main(String[] args) {

        String input = "1122333344555566778888";
        String regex = "(\\w)\\1+";

        Matcher m = Pattern.compile(regex).matcher(input);

        List<String> l = new ArrayList<String>();
        while (m.find()) l.add(m.group());

        System.out.println(Arrays.toString(l.toArray()));
    }   
}

这个够漂亮吗?这只是一句话

String parts = input.replaceAll("(.)(?!\\1)", "$1\0").split("\0");

这里有一个测试:

public static void main(String[] args) {
    String input = "1122333344555566778888";
    String[] parts = input.replaceAll("(.)(?!\\1)", "$1\0").split("\0");
    System.out.println(Arrays.toString(parts));
}
输出:

[11, 22, 3333, 44, 5555, 66, 77, 8888]
[11, 22, 3333, 44, 5555, 66, 77, 8888]

请注意,此解决方案有一个非常小的问题-在调用
replaceAll()
时,
$1
后面的字符不能包含在输入中。我选择空字符
'\0'
(即十六进制零)是为了相当安全。

我会这样做: 给定一个未排序的字符串“abcabc”,可以通过将其转换为Char[]数组,然后使用Arrays.sort(),将其转换为aaabbccc来对其排序

    public String[] sortThis(String inputData) {
    String input = "ABCABCABC"; //make this whatever you want (or set to inputData)
    String[] temp = new String[input.length()];
    for (int i = 0; i < input.length();i++) //initialize the array, or it prints "null"
        temp[i] = "";
    int index = 0;
    char[] info = input.toCharArray();
    Arrays.sort(info);

    for (int i = 0; i < input.length(); i++) { // fill the temp array
        temp[index] += info[i];
        if(i+1 < input.length())
            if(i < input.length() && info[i] != info[i+1])
                index++;
    }

    String[] answer = new String[index+1]; 
    for(int i = 0; i < index+1; i++) // shorten the array
        answer[i] = temp[i];

    return answer;
    }

也许你想用这个:

11
22
3333
44
5555
66
77
8888
    [AAA, BBB, CCC]
var str="1122333344555566778888"; //whatever
b=0;outpt="";
while(b<=18){
if(b==4|b==10|b==18){e=4;p=4}else{e=2;p=2}
outpt+=str.substr(b,e)+", ";b+=p;}
alert(outpt);
11, 22, 3333, 44, 5555, 66, 77, 8888, 

到目前为止你试过什么?可以通过仲裁编号进行拆分。组是否总是编号和顺序?拆分背后的逻辑是什么?你想分开不同的数字,还是目标是什么?我试着硬编码它,八次使用string.substring(开始,结束)函数,但代码看起来很糟糕。因此,我正在寻找一个漂亮的解决方案。是否要基于a)部分的预定长度(不考虑内容)或B)连续的相同字符块(不考虑长度)进行拆分?我这里没有任何分隔符,只有纯stringPattern p=Pattern.compile(([\d\w\s]\2*));在eclipse中给出一个错误-无效的转义序列在java中您需要转义,因此您需要使用
([\\d\\w\\s]\\2*)
使其有效@boban其他错误:索引14附近的未关闭组([\d\w\s]\2*)对不起,这是我的错误,我错过了一个结束括号)更新的答案以使用
([\d\w\s])\2*)
@Bob