2012-02-02 148 views
0

我想從字符串除去開頭和結尾的空白:如何從Java中的字符串中刪除前導和尾隨空白?

String s = "   Hello World     "; 

我想要的結果是這樣的:

s == "Hello world"; 
+0

我從來沒有想過如何做這種事情沒有預定義的方法。假設它是可能的,那麼你需要迭代字符串中的所有字符,但是你必須再次使用類String的charAt()方法。它是爲你預定的嗎? – ka3ak 2012-02-02 08:00:16

+0

這是家庭作業的怪胎。 – Bombe 2012-02-02 08:18:41

+0

@ ka3ak或使用模式。 – Nishant 2012-02-02 08:19:11

回答

22
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+"!"); 
+0

如果這個答案被接受,問題的作者用「預定義」表示的是什麼?... – ka3ak 2012-02-02 11:40:22

+0

@ ka3ak我假設「刪除前後空格「 – Nishant 2012-02-02 11:59:09

1
String s="Test "; 
s= s.trim(); 
0
String s="   Hello World     "; 
s = s.trim(); 

因爲我不喜歡使用正則表達式的瑣碎問題的更多信息See This

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

雖然@ 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; 

此計數在開始和結束字符串尾部空格的數量,直到從得到無論是「左」和「右」的索引空白計數符合,或者兩個索引都達到了非空白字符。之後,我們要麼返回使用空白計數獲得的子字符串,要麼返回空字符串(如果結果是空格)(需要考慮具有奇數字符的全空白字符串)。

+0

儘管這段代碼片段是受歡迎的,並且可能會提供一些幫助,但它會[如果包含解釋](// meta.stackexchange.com/q/114762) *和*爲什麼*這解決了這個問題。請記住,你正在爲將來的讀者回答這個問題,而不僅僅是現在問的人!請編輯您的答案以添加解釋,並指出適用的限制和假設。 – 2017-04-05 12:13:55

+0

@TobySpeight添加了解釋,希望它有用/足夠:)。 – 2017-04-05 12:50:32

+0

輕微的微型優化,但是直到你找到一個非空白字符而不是總是數到中間,不是更好嗎? – DavidBittner 2017-05-30 13:23:30

相關問題