Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用Java调整句子中空格字符的数量?_Java_Regex - Fatal编程技术网

如何用Java调整句子中空格字符的数量?

如何用Java调整句子中空格字符的数量?,java,regex,Java,Regex,我想做一个方法来证明java中的文本是正确的。为此,我需要一个正则表达式,它必须匹配任意空格字符,然后用两个空格逐个替换它们。如果没有一个空间,那么它必须搜索两个空间并将其设为三个;如果没有两个空间,那么它必须搜索三个空间并将其设为四个空间。这样下去 如何在java中使用正则表达式实现这一点 我使用replaceFirst(String regex,String replacement)方法。尝试以下方法: Pattern p = Pattern.compile("(\\s+)"); Match

我想做一个方法来证明java中的文本是正确的。为此,我需要一个正则表达式,它必须匹配任意空格字符,然后用两个空格逐个替换它们。如果没有一个空间,那么它必须搜索两个空间并将其设为三个;如果没有两个空间,那么它必须搜索三个空间并将其设为四个空间。这样下去

如何在java中使用正则表达式实现这一点

我使用replaceFirst(String regex,String replacement)方法。

尝试以下方法:

Pattern p = Pattern.compile("(\\s+)");
Matcher m = p.matcher(input);
if (m.find()) {
    input = m.replaceAll("$1 ");
}
System.out.println(input);
使用上述代码:

"How can   I do  that with regex?" 
变成

"How  can    I  do   that  with  regex?"

你可能走错了路。以下是我将如何做到这一点:

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.");
}
下面是如何将文本拆分为行,然后进行对齐:

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);
}

为什么要使用正则表达式?你看到这个问题了吗:继续。。。无限?直到长度达到所需长度,但我需要为multiline@MOD你说的多行是什么意思?您的意思是您的字符串已经包含
\n
个字符,或者您的字符串太长,无法放在一行中,因此需要先将其拆分为几行,然后将这些行的宽度对齐?我需要一个正则表达式,匹配句子中的第一个空格如果单词后面有多个空格,那么它应该匹配第一个空格,如果没有空格,那么它应该匹配句子中的前两个空格,依此类推。我不能一下子把它们全部换掉
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);
}
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.