【问题标题】:Divide string into substrings in java在java中将字符串划分为子字符串
【发布时间】:2012-11-06 00:03:43
【问题描述】:

我有一个字符串1122333344555566778888 我需要对其进行子串化,结果得到[11, 22, 3333, 44, 5555, 66, 77, 8888] 是否有可能以一种漂亮的方式做到这一点,或者我需要对其进行硬编码并八次使用string.substring(beginning, ending) 函数,然后放入array

编辑: 字符串不仅可以包含重复的数字。 AB CG HERD KJ 98HQ 0K 1E OOQW也是例子!

【问题讨论】:

  • 到目前为止你尝试过什么?可以通过任意数字进行拆分。
  • 组总是按顺序排列的吗?
  • 拆分背后的逻辑是什么?你想区分不同的数字,或者目标是什么?
  • 我尝试对其进行硬编码并八次使用 string.substring(beginning, ending) 函数,但代码看起来很糟糕。因此,我正在寻找一个漂亮的解决方案。
  • 您要根据 A) 预先确定的部分长度进行拆分,无论内容如何,​​还是 B) 连续的相同字符块,无论长度如何?

标签: java arrays string substring


【解决方案1】:

使用模式:((\d)\2*)

String input = "1122333344555566778888";
Pattern p = Pattern.compile("((\\d)\\2*)");
Matcher m = p.matcher(input);
while (m.find()) {
    System.out.println("Found " + m.group(1));
}

产生:

11
22
3333
44
5555
66
77
8888

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

【讨论】:

  • Pattern p = Pattern.compile("(([\d\w\s]\2*)"); 在 eclipse 中给出错误 - 无效的转义序列
  • 在java中你需要转义转义,所以你需要使用(([\\d\\w\\s]\\2*)使其有效@Bob
  • 另一个错误:索引 14 附近的未封闭组 (([\d\w\s]\2*)
  • 对不起,这是我的错误,我错过了右括号)更新了使用(([\d\w\s])\2*)@Bob的答案
【解决方案2】:

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

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

重要提示:

substrings 数组包含空条目,因为它的长度等于输入字符串的长度。如果您的字符串包含不重复的连续字符,则此数组可能没有空条目。在substrings 上观看NullPointerException

【讨论】:

    【解决方案3】:

    此字符串中没有分隔符可以使用 .split(),如果您在想要的子字符串之间有分隔符,例如 11-22-3333- ... 等,这将很容易使用

    String[] splits = asseltClasses.split("-");
    

    【讨论】:

    • 我这里没有分隔符,就是纯字符串
    【解决方案4】:

    基于 BlueBullet 的 ...

    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()));
        }   
    }
    

    输出:

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

    【讨论】:

      【解决方案5】:

      这够漂亮吗?就这么一行……

      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]
      

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

      【讨论】:

        【解决方案6】:

        这就是我要做的: 给定一个未排序的字符串“ABCABCABC”,您可以将其转换为 Char[] 数组,然后使用 Arrays.sort() 将其转换为 AAABBBCCC。

            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;
            }
        

        输出:

            [AAA, BBB, CCC]
        

        【讨论】:

          【解决方案7】:

          也许你想用这个:

          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, 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-09-26
            • 2015-06-06
            • 1970-01-01
            • 2013-08-27
            • 2011-04-15
            • 1970-01-01
            相关资源
            最近更新 更多