-1

I want to do a method to justify a text in java. For that i need a regular expression that must match the any space characters and then replace them with two spaces one by one. If there is no one space then it must search for two spaces and make them three and if there is no two spaces then it must search for three spaces and make them four spaces. This goes on...

How can do that with regex in java?

I use replaceFirst(String regex, String replacement) method.

MOD
  • 1,070
  • 3
  • 19
  • 41

2 Answers2

1

Try this:

Pattern p = Pattern.compile("(\\s+)");
Matcher m = p.matcher(input);
if (m.find()) {
    input = m.replaceAll("$1 ");
}
System.out.println(input);

With the above code:

"How can   I do  that with regex?" 

becomes

"How  can    I  do   that  with  regex?"
  • I want a regex, that matches first one space in the sentence if there is multiple one space behind the words it should match the first one, if there is no one space then it should match the first two spaces in the sentence and so on. I cant replace them all at once – MOD Feb 27 '13 at 06:44
1

You probably took wrong way. Here is how I would do this:

public static String addSpaces (String string, int desiredLength)
{
    String [] parts = string.trim ().split ("\\s+");

    int l = parts.length;

    if (l <= 1)
        return string; // Cannot add spaces because there is only one word
    else
    {
        int count = 0;
        for (String part: parts)
            count += part.length ();

        count = desiredLength - count;

        if (count < 0) count = 0;

        int n = count / (l - 1);
        int k = count % (l - 1);

        StringBuilder result = new StringBuilder (parts [0]);
        for (int i = 0; i < l - 1; i++)
        {
            int m = i < k ? n + 1 : n;

            for (int j = 0; j < m; j++)
                result.append (' ');

            result.append (parts [i + 1]);
        }

        return result.toString ();
    }
}

public static void main (String [] args)
{
    System.out.println (addSpaces ("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec est ligula, porta", 80));
    System.out.println (addSpaces ("quis feugiat eget, congue ac odio. Curabitur in purus mi, nec feugiat velit. Ut", 80));
    System.out.println (addSpaces ("pulvinar massa vel risus fringilla adipiscing. Aliquam fringilla congue mi, eget", 80));
    System.out.println (addSpaces ("consectetur nibh egestas at. In hac habitasse platea dictumst. Nullam interdum", 80));
    System.out.println (addSpaces ("rutrum laoreet. Etiam vestibulum diam dui. Phasellus erat sapien, pulvinar vel", 80));
    System.out.println (addSpaces ("rutrum eu, accumsan vel ante. Etiam odio erat, commodo eu rutrum eu, molestie id", 80));
    System.out.println (addSpaces ("tellus. Ut eu ante ipsum. Cras pretium bibendum nisi a rhoncus. Lorem ipsum", 80));
    System.out.println (addSpaces ("dolor sit amet, consectetur adipiscing elit. Etiam porta, urna non placerat", 80));
    System.out.println (addSpaces ("rutrum, velit enim aliquet arcu, non vehicula sem mauris non dui. Quisque est", 80));
    System.out.println (addSpaces ("nisi, facilisis non pretium et, luctus in nisi. Ut sed luctus enim. Maecenas", 80));
    System.out.println ("vitae lorem vel justo aliquet consectetur.");
}

Output is:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec est ligula, porta
quis  feugiat eget, congue ac odio. Curabitur in purus mi, nec feugiat velit. Ut
pulvinar massa vel risus fringilla adipiscing. Aliquam fringilla congue mi, eget
consectetur  nibh  egestas at. In hac habitasse platea dictumst. Nullam interdum
rutrum  laoreet.  Etiam vestibulum diam dui. Phasellus erat sapien, pulvinar vel
rutrum eu, accumsan vel ante. Etiam odio erat, commodo eu rutrum eu, molestie id
tellus.  Ut  eu  ante  ipsum.  Cras pretium bibendum nisi a rhoncus. Lorem ipsum
dolor  sit  amet,  consectetur  adipiscing  elit. Etiam porta, urna non placerat
rutrum,  velit  enim  aliquet arcu, non vehicula sem mauris non dui. Quisque est
nisi,  facilisis  non  pretium  et, luctus in nisi. Ut sed luctus enim. Maecenas
vitae lorem vel justo aliquet consectetur.

And here is how you can split text into lines and then justify:

public static String addSpaces (String [] words, int count)
{
    int l = words.length;

    if (l == 0)
        return "";
    else if (l == 1)
        return words [0];
    else
    {
        int n = count / (l - 1);
        int k = count % (l - 1);

        StringBuilder result = new StringBuilder (words [0]);
        for (int i = 0; i < l - 1; i++)
        {
            result.append(' ');

            int m = i < k ? n + 1 : n;

            for (int j = 0; j < m; j++)
                result.append (' ');

            result.append (words [i + 1]);
        }

        return result.toString ();
    }
}

public static String [] justify (String string, int width)
{
    List<String> result = new ArrayList<String>();

    String [] words = string.trim ().split ("\\s+");

    int n = 0;
    List<String> line = new ArrayList<String>();
    for (String word: words)
    {
        if (!line.isEmpty () && n + word.length () > width)
        {
            result.add (
                addSpaces (
                    line.toArray (
                        new String [line.size ()]), 
                    Math.max (0, width - n)));

            line.clear ();
            n = 0;
        }

        line.add (word);
        if (n > 0)
            n += 1;
        n += word.length();
    }

    result.add (addSpaces (line.toArray (new String [line.size ()]), 0));
    return result.toArray(new String [result.size ()]);
}

public static void main (String [] args)
{
    String text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut porta bibendum ipsum vitae pretium. Nulla facilisi. Aenean eu orci eget diam bibendum lobortis. Nulla nisl ante, consectetur feugiat tincidunt eget, venenatis a velit. Nullam eget justo pellentesque diam commodo pharetra imperdiet ut tellus. Maecenas massa mi, placerat et vestibulum non, luctus ut nulla. Nam id libero vel massa malesuada commodo vel nec magna. Maecenas faucibus fermentum nisi et mattis.";
    String [] lines = justify (text, 80);
    for (String line: lines)
        System.out.println (line);
}

The output is:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut porta bibendum ipsum
vitae pretium. Nulla facilisi. Aenean eu orci eget diam bibendum lobortis. Nulla
nisl  ante,  consectetur  feugiat tincidunt eget, venenatis a velit. Nullam eget
justo pellentesque diam commodo pharetra imperdiet ut tellus. Maecenas massa mi,
placerat  et  vestibulum non, luctus ut nulla. Nam id libero vel massa malesuada
commodo vel nec magna. Maecenas faucibus fermentum nisi et mattis.
Mikhail Vladimirov
  • 13,572
  • 1
  • 38
  • 40
  • But i need to do it for multiline – MOD Feb 27 '13 at 05:55
  • @MOD What do you mean by multiline? You mean that your string already contain `\n` characters or you mean that your string is too long to fit in one line, so you need to first split it into several lines, and then justify these lines to be of the same width? – Mikhail Vladimirov Feb 27 '13 at 06:38