Adam
Adam

Reputation: 10056

Replacing characters in a string, Java

I have a string like s = "abc.def..ghi". I would like to replace the single'.' with two '.'s. However, s.replace(".", "..") yields "abc..def....ghi". How can I get the correct behaviour? The output I'm looking for is s = "abc..def..ghi".

Upvotes: 5

Views: 220

Answers (4)

Bohemian
Bohemian

Reputation: 425448

Use look arounds:

str = str.replaceAll("(?<!\\.)\\.(?!\\.)", "..")(

The regex reads as "a dot, not preceded by a dot, and not followed by a dot". This will handle the edge cases of a dot being at the start/end and/or surrounded by literally any other character.

Because look arounds don't consume input, you don't have to sully yourself with back references in the replacement term.

Upvotes: 2

SkrewEverything
SkrewEverything

Reputation: 2523

If you don't know how to do it using regex then use StringTokenizer to split the String and again concatenate with ...

Code:

public static void main(String[] args) {
    String s = "abc.def..ghi";
    StringTokenizer s2 = new StringTokenizer(s, ".");
    StringBuilder sb = new StringBuilder();


    while(s2.hasMoreTokens())
    {
        sb.append(s2.nextToken().toString());
        sb.append("..");
    }
    sb.replace(sb.length()-2, sb.length(), ""); // Just delete an extra .. at the end

    System.out.println(sb.toString());

}

I know that the code is big compared to one line regex but I posted it in case if you are having any trouble with regex. If you think it is slower than the accepted answer, I did a start and end time with System.currentTimeMillis() and I got mine faster. I don't know if there are any exceptions to that test.

Anyway, I hope it helps.

Upvotes: 3

baao
baao

Reputation: 73301

Replace the dot only when it's surrounded by two characters

String foo = s.replaceAll("(\\w)\\.(\\w)", "$1..$2");

Or as @Thilo commented, only if it's surrounded by two non dots

String foo = s.replaceAll("([^.])\\.([^.])", "$1..$2");

And to replace the single dot with two dots even if the dot is at the beginning/end of the string, use a negative lookahead and lookbehind: (Example String: .abc.def..ghi. will become ..abc..def..ghi..)

String foo = s.replaceAll("(?<!\\.)\\.(?!\\.)", "..");

Upvotes: 6

James Real
James Real

Reputation: 97

s.replace("...","..");
s.replace("....","..");

Depends on input possibilities..

Upvotes: -6

Related Questions