如何使用正则表达式将字符串中的连续重复字符替换为“ 0”?

时间:2019-08-10 12:49:39

标签: java regex pattern-matching

我有一个String s="666788899"

,我需要将其输出为600780090

java中是否可以使用正则表达式来更改这样的字符串。

我使用天真的方法解决了这个问题。实际上,我正在解决一个问题,其中包括带有这样的字符串数组的另一个循环。包括我的内部循环,它上升到O(n ^ 2),这是不可接受的。

 int len=str.length();
 char c=str.charAt(0);
 for(int i=1;i<len;i++)
 {   
     if(str.charAt(i)==c)
     {
         str.setCharAt(i,'0');
     }     
     else
         c=str.charAt(i);
 }

输入字符串:

3888667222

输出字符串:

3800607200

3 个答案:

答案 0 :(得分:2)

您可以仅使用

(not published)

或者,如果您需要允许匹配的换行符,

$sql = "UPDATE posts SET published = not published WHERE id=$post_id";

请参见regex demoJava demo online

.replaceAll("(?<=(.))\\1", "0")

详细信息

  • .replaceAll("(?s)(?<=(.))\\1", "0") -System.out.println("666788899".replaceAll("(?<=(.))\\1", "0")); // => 600780090 System.out.println("3888667222".replaceAll("(?<=(.))\\1", "0")); // => 3800607200 嵌入式嵌入标记
  • (?s)-一个正向后方的视图,其中包含一个与任何字符匹配到第1组的捕获组
  • Pattern.DOTALL-内联反向引用,用于匹配并使用下一个与上一个相同的字符。

因此,第一个字符始终保留,而随后的字符被(?<=(.))替换。

答案 1 :(得分:0)

对于正则表达式选项,您可以尝试使用正式的Java正则表达式模式匹配器:

Pattern pattern = Pattern.compile("(.)\\1+");
Matcher matcher = pattern.matcher("666788899");
StringBuffer buffer = new StringBuffer();

while(matcher.find()) {
    String zeroes = matcher.group(0).substring(1).replaceAll(".", "0");
    matcher.appendReplacement(buffer, matcher.group(1) + zeroes);
  }
matcher.appendTail(buffer);
System.out.println(buffer.toString());

此打印:

600780090

我在这里遵循的一般模式是使用正则表达式回调函数。我们要匹配任何单个数字/字符,然后再匹配一次或多次。然后,在回调中,我们找出在原始初始字符之后需要用多少个零代替。

答案 2 :(得分:0)

您还可以使用余数和除法运算符来完成此操作。但是您仅限于该范围内的数字。

   // convert consecutive, duplicate, digits to 0.
   public static long convert(long k) {
      long n = k % 10;
      long sum = 0;
      if (k > 0) {
         sum = convert(k / 10);
      }
      if (k % 10 == (k / 10) % 10) {
         n = 0;
      }
      sum = sum * 10 + n;
      return sum;
   }

这里是一个例子。

      long val = 282288829229991333L;
      System.out.println(val);
      System.out.println(convert(val));

打印

282288829229991333

282080029209001300

这里是仅使用字符数组但不使用正则表达式的方法。而且效率很高。

   public static String convert(String a) {
      char[] chars = a.toCharArray();
      char c = chars[0];
      int i = 1;
      while (i < chars.length) {
         char cc = chars[i];
         if (c == cc) {
            chars[i] = '0';
         }
         else {
            c = cc;
         }
         i++;
      }
      return String.valueOf(chars);
   }