正则表达式如何匹配字符串中的非重复子字符串?

时间:2019-04-22 07:49:12

标签: java regex

有一个字符串:

"1112344866893334". 

我想使用正则表达式匹配不重复的子字符串,例如:

"23", "8", "89", "4".

我该怎么做?

3 个答案:

答案 0 :(得分:0)

您可以遍历字符串的长度,然后使用正则表达式断言子字符串不会重复,例如

String input = "1112344866893334";
for (int i=0; i < input.length()-1; ++i) {
    String substring = input.substring(i, i+2);
    String regex = "(?!.*" + substring + ".*" + substring + ").*";
    if (input.matches(regex)) {
        System.out.println("matching substring: " + substring);
    }
}

答案 1 :(得分:0)

只要您可以容忍空匹配,就可以使用它:

import java.util.Arrays;

public class HelloWorld
{
  public static void main(String[] args)
  {
    String[] items = "1112344866893334".split("(\\d)\\1+");
    System.out.print(Arrays.toString(items));
  }
}

答案 2 :(得分:0)

我修改了先前的答案,以包括一些特殊情况。

其中包括:

  • 字符串以重复数字开头(例如111 .....)
  • 空字符串
  • 字符串仅包含重复的数字(例如1122334455)
  • 一系列不同的重复数字(例如11122233365 ...)
  • 字符串中一系列不同的重复序列(例如4311122233398)
      String[] testCases = {
            "2111222333594454555", "333555666540922229789", "", "54", "111",
            "111222333"
      };
      for (String s : testCases) {
         String[] ss = s.replaceAll("(\\d)\\1+", "AA")
                        .replaceAll("^[A]+", "")
                        .split("[A]+");
         System.out.println(Arrays.toString(ss));
      }
   }

第一个replaceAll用AA替换所有出现的重复数字。 第二个从字符串开头删除重复的A。 拆分在重复的A上拆分。