如何从Java中的字符串中删除前导和尾随空格?

时间:2012-02-02 07:51:19

标签: java whitespace

我想从字符串中删除前导和尾随空格:

String s = "          Hello World                    ";

我希望结果如下:

s == "Hello world";

11 个答案:

答案 0 :(得分:27)

 s.trim()

请参阅String#trim()

没有任何内部方法,请使用正则表达式

 s.replaceAll("^\\s+", "").replaceAll("\\s+$", "")

  s.replaceAll("^\\s+|\\s+$", "")

或仅使用纯粹形式的模式

    String s="          Hello World                    ";
    Pattern trimmer = Pattern.compile("^\\s+|\\s+$");
    Matcher m = trimmer.matcher(s);
    StringBuffer out = new StringBuffer();
    while(m.find())
        m.appendReplacement(out, "");
    m.appendTail(out);
    System.out.println(out+"!");

答案 1 :(得分:3)

String s="Test "; 
s= s.trim();

答案 2 :(得分:1)

使用String类trim方法。它将删除所有前导和尾随空格。

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html

答案 3 :(得分:1)

String s="          Hello World                    ";
s = s.trim();

了解更多信息See This

答案 4 :(得分:1)

我不喜欢使用正则表达式来处理琐碎的问题。这将是一个简单的选择:

public static String trim(final String s) {
    final StringBuilder sb = new StringBuilder(s);
    while (sb.length() > 0 && Character.isWhitespace(sb.charAt(0)))
        sb.deleteCharAt(0); // delete from the beginning
    while (sb.length() > 0 && Character.isWhitespace(sb.charAt(sb.length() - 1)))
        sb.deleteCharAt(sb.length() - 1); // delete from the end
    return sb.toString();
}

答案 5 :(得分:1)

String.trim()回答了问题,但对我来说不是一个选择。 如here所述:

  

它简单地将直到U + 0020(包括空格)的所有内容都视为空白,并将高于此的任何内容视为非空白。

     

这将导致它修剪U + 0020空格字符和U + 0020以下的所有“控制代码”字符(包括U + 0009制表符),但不修剪其上方的控制代码或Unicode空格字符。 / p>

我正在与日语一起工作,因为我们有全角字符Like this,String.trim()不会修剪全角空格。

因此,我做了一个函数,就像xehpuk的代码片段一样,使用了Character.isWhitespace()。 但是,此版本未使用StringBuilder,而是删除了字符,而是找到了从原始String中删除修剪后的子字符串所需的2个索引。

public static String trimWhitespace(final String stringToTrim) {
    int endIndex = stringToTrim.length();
    // Return the string if it's empty
    if (endIndex == 0) return stringToTrim;
    int firstIndex = -1;

    // Find first character which is not a whitespace, if any
    // (increment from beginning until either first non whitespace character or end of string)
    while (++firstIndex < endIndex && Character.isWhitespace(stringToTrim.charAt(firstIndex))) { }

    // If firstIndex did not reach end of string, Find last character which is not a whitespace,
    // (decrement from end until last non whitespace character)
    while (--endIndex > firstIndex && Character.isWhitespace(stringToTrim.charAt(endIndex))) { }

    // Return substring using indexes
    return stringToTrim.substring(firstIndex, endIndex + 1);
}

答案 6 :(得分:0)

s = s.trim();

更多信息: http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#trim()

为什么不想使用预定义的方法?它们通常效率最高。

答案 7 :(得分:0)

请参阅String#trim()方法

答案 8 :(得分:0)

只需使用 trim()。它仅消除字符串的开头和结尾多余的空格。

String fav =“我喜欢苹果”;

  

fav = fav.trim();

     

System.out.println(fav);

输出: 我喜欢苹果//字符串的开头和结尾都没有空格

答案 9 :(得分:0)

由于Java 11字符串类具有 strip()方法,该方法用于返回值为该字符串的字符串,并且已删除所有前导和尾随空白。引入它是为了解决修整方法的问题。

文档:https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html#strip()

示例:

String str = "  abc    ";
// public String strip()
str = str.strip(); // Returns abc

Java 11+ String类中还有两个有用的方法:

  1. stripLeading():返回其值为该字符串的字符串, 删除所有前导空白。

  2. stripTrailing():返回其值为该字符串的字符串, 删除所有尾随空白。

答案 10 :(得分:-1)

虽然@ xehpuk的方法很好,如果你想避免使用正则表达式,但它有O(n ^ 2)时间复杂度。以下解决方案也避免了正则表达式,但是O(n):

if(s.length() == 0)
    return "";
char left = s.charAt(0);
char right = s.charAt(s.length() - 1);
int leftWhitespace = 0;
int rightWhitespace = 0;
boolean leftBeforeRight = leftWhitespace < s.length() - 1 - rightWhitespace;

while ((left == ' ' || right == ' ') && leftBeforeRight) {
    if(left == ' ') {
        leftWhitespace++;
        left = s.charAt(leftWhitespace);
    }
    if(right == ' ') {
        rightWhitespace++;
        right = s.charAt(s.length() - 1 - rightWhitespace);
    }

    leftBeforeRight = leftWhitespace < s.length() - 1 - rightWhitespace;
}

String result = s.substring(leftWhitespace, s.length() - rightWhitespace);
return result.equals(" ") ? "" : result;

这将计算字符串开头和结尾的尾随空格数,直到&#34; left&#34;和&#34;对&#34;从空白计数获得的索引满足,或者两个索引都达到了非空白字符。之后,我们要么返回使用空白计数获得的子字符串,要么返回空字符串,如果结果是空格(需要考虑具有奇数个字符的所有空白字符串)。