tags:

views:

3352

answers:

7

In java, which regular expression can be used to replace these, for example:

before: aaabbb after: ab

before: 14442345 after: 142345

thanks!

+13  A: 

In perl

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

Does the trick, I assume if java has perl compatible regexps it should work too.

Edit: Here is what it means

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)

Edit: As others have pointed out, the syntax in Java would become

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

remember to escape the \1

Pat
+10  A: 
 String a = "aaabbb";
 String b = a.replaceAll("(.)\\1+", "$1");
 System.out.println("'" + a + "' -> '" + b + "'");
smink
+3  A: 
"14442345".replaceAll("(.)\\1+", "$1");
Matthew Crumley
+2  A: 
originalString.replaceAll( "(.)\\1+", "$1" );
Jeff Hillman
A: 

in TextEdit (assuming posix expressions) find: [a]+[b]+ replace with: ab

A: 

match pattern (in Java/languages where \ must be escaped):

(.)\\1+

or (in languages where you can use strings which don't treat \ as escape character)

(.)\1+

replacement:

$1
Imran
A: 

In Perl:

tr/a-z0-9//s;

Example:

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

If Java has no tr analog then:

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

Example:

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