How to remove spaces from string only if it occurs once between two words but not if it occurs thrice?

Vishal Dalwadi :

I am a beginner working on a diff and regenerate algorithm but for Strings. I store the patch in a file. To regenerate the new string from old I use that file. Although the code works, I face a problem when using space.

I use replaceAll(" ", ""); for removing spaces. This is fine when the string is [char][space][char], but creates problem when it is like [space][space][space]. Here, I want that the space be retained(only one).

I thought of doing replaceAll(" ", " ");. But this would leave spaces in type [char][space][char]. I am using scanner to scan through the string.

Is there a way to achieve this?

Input      Output
 c      => c
cc      => cc
c c     => cc
c  c    => This is not possible. Since there will be padding of one space for each character
c   c   => c c
MC Emperor :

You could use lookarounds to do your replacement:

String newText = text
    .replaceAll("(?<! ) (?! )", "")
    .replaceAll(" +", " ");

The first replaceAll removes any space not surrounded by spaces; the second one replaces the remaining sequences of spaces by a single one.

Ideone example. Sequences of two or more spaces become a single space, and single spaces are removed.

Lookarounds

A lookaround in the context of regular expressions is a collective term for lookbehinds and lookaheads. These are so-called zero-width assertions, that means they match a certain pattern, but do not actually consume characters. There are positive and negative lookarounds.

A short example: the pattern Ira(?!q) matches the substring Ira, but only if it's not followed by a q. So if the input string is Iraq, it won't match, but if the input string is Iran, then the match is Ira.

More info:

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=164094&siteId=1