正则表达式只用一个替换两个(或多个)连续字符?

时间:2008-09-19 22:12:57

标签: java regex

在java中,可以使用哪个正则表达式替换这些, 例如:

之前: AAABBB 后: AB

之前: 14442345 后: 142345

谢谢!

8 个答案:

答案 0 :(得分:34)

在perl

s/(.)\1+/$1/g;

诀窍,我假设如果java具有perl兼容的regexp它也应该工作。

编辑:这就是它的含义

s {
    (.)  # match any charater ( and capture it )
    \1   # if it is followed by itself 
    +    # One or more times
}{$1}gx;  # And replace the whole things by the first captured character (with g modifier to replace all occurences)

编辑:正如其他人所指出的那样,Java中的语法将成为

original.replaceAll("(.)\\1+", "$1");

记得逃避\ 1

答案 1 :(得分:16)

String a = "aaabbb";
String b = a.replaceAll("(.)\\1+", "$1");
System.out.println("'" + a + "' -> '" + b + "'");

答案 2 :(得分:3)

"14442345".replaceAll("(.)\\1+", "$1");

答案 3 :(得分:2)

originalString.replaceAll( "(.)\\1+", "$1" );

答案 4 :(得分:1)

匹配模式(在必须转义\的Java /语言中):

(.)\\1+

或(在您可以使用不将\视为\作为转义字符的字符串的语言中)

(.)\1+ 

替换

$1

答案 5 :(得分:0)

在TextEdit中(假设posix表达式) 找到:[a] + [b] + 替换为:ab

答案 6 :(得分:0)

Perl:

tr/a-z0-9//s;

示例:

$ perl -E'@a = (aaabbb, 14442345); for(@a) { tr/a-z0-9//s; say }'
ab
142345 

如果Java没有tr模拟,那么:

s/(.)\1+/$1/sg; 
#NOTE: `s` modifier. It takes into account consecutive newlines.

示例:

$ perl -E'@a = (aaabbb, 14442345); for(@a) { s/(.)\1+/$1/sg; say }'
ab
142345 

答案 7 :(得分:0)

使用Java 7:命名组加入

static String cleanDuplicates(@NonNull final String val) { 
      assert val != null;
      return val.replaceAll("(?<dup>.)\\k<dup>+","${dup}");
}