Search code examples
javaregexreplaceall

Modifying part of a regex in replaceAll call


I am trying to format a string with a regex as follows:

String string = "5.07+12.0+2.14";
string = string.replaceAll("\\.0[^0-9]","");

What I think will happen is the string will become:

5.07+122.14 //the regex will delete the .0+ next to the 12

How can I create the regex so that it deletes only the .0 not the + sign?

I would prefer to do everything in the same call to "replaceAll"

thanks for any suggestions


Solution

  • Matched characters will be replaced. So, instead of matching the non-digit at the end, you can use lookahead, which will perform the desired check but won't consume any characters. Also, the shorthand for a non-digit is \D, which is a bit nicer to read than [^0-9]:

    String string = "5.07+12.0+2.14";
    string = string.replaceAll("\\.0(?=\\D)","");
    

    If you want to replace all trailing zeros (for example, replace 5.00 with 5 instead of 50, which you probably don't want), then repeat the 0 one or more times with + to ensure that all zeros after the decimal point get replaced:

    String string = "5.07+12.000+2.14";
    string = string.replaceAll("\\.0+(?=\\D)","");
    

    If the string never contains alphabetical or underscore _ characters (those and numeric characters count as word characters), then you can make it even prettier with a word boundary instead of a lookahead. A word boundary, as it sounds, will match a position with a word character on one side and a non-word character on the other side, with \b:

    string = string.replaceAll("\\.0+\\b","");