2013-10-09 2 views
1

У меня есть строка, как это:Удалить пробельные в начале каждой строки и положить конец конец каждой строки

Mr Moh Jo\n 
Address\n 
33333 City\n\n 
Aland Islands 

, и я хотел бы удалить пробельные в начале каждой строки и положить конец конец в каждой строке с следующий код, но он не работает

public static String trimWhiteSpaceFromTheBeginingAndEndOFTheLine(
     String string) { 
    Pattern trimmer = Pattern.compile("^\\s+|\\s+$"); 
    Matcher m = trimmer.matcher(string); 
    StringBuffer out = new StringBuffer(); 
    while (m.find()) 
     m.appendReplacement(out, ""); 
    m.appendTail(out); 

    return out.toString(); 
} 

Ожидаемый результат:

Mr Moh Jo\n 
Address\n 
33333 City\n\n 
Aland Islands 
+2

эпическая имя функции – Aneesh

+1

Можно создать дубликат http://stackoverflow.com/questions/6652687/strip-leading-and-trailing-spaces-from-java-string – newuser

+0

Возможный дубликат HTTP: // StackOverflow. com/questions/6652687/strip-lead-and-trailing-spaces-from-java-string дубликат http://stackoverflow.com/questions/3796121/trim-whitespace-from-a-string: P – codeMan

ответ

2

почему бы не использовать, он точно делает то, что и хотят

String.trim() 

Вы могли бы сделать что-то вроде этого:

String address = 
"Mr Moh Jo \n" + 
"Address \n" + 
" 33333 City \n" + 
"Aland Islands \n"; 

String [] addrLines = address.split("\n"); 
StringBuffer formatedAddress = new StringBuffer(); 

for(String line : addrLines) 
{ 
    formatedAddress.append(line.trim()+ "\n"); 
} 

System.out.println("formatedAddress: "); 
System.out.println(formatedAddress.toString()); 
+0

'String.trim()' не обрезает пробелы с начала строк в многострочной строке. –

+0

Я отредактировал свой ответ, чтобы включить то, что я точно имею в виду. – codeMan

+1

это сработало спасибо – molwiko

0

Попробуйте это:

String s = "Your multi line string"; 
     System.out.println(s); 

     String[] splitString = s.split("\n"); 
     s=""; 

     for(int i =0;i<splitString.length;i++) 
     { 
      splitString[i] = splitString[i].trim(); 
      s+=splitString[i]+"\n"; 

     } 
     System.out.println(s); 
+0

'trim () 'имеет довольно странное понятие пробела, учитывая только c ≤ U + 0020. – Joey

0

Ваш вклад является одной строкой. поэтому trim() опускают начальный и конечный whitespaces, а не между ними. Так разделите строку на lineBreak. и trim() все отдельные значения.

 String[] inputArray = sample.split("\n"); 
     StringBuilder stringBuilder = new StringBuilder(); 
     for(String value : inputArray) 
     { 
      stringBuilder.append(value.trim()); 
      stringBuilder.append("\n"); 
     } 
     System.out.println("Sample : "+stringBuilder.toString()); 
+0

строка содержит разрыв строки \ n – molwiko

3

Просто включите многострочный флаг в регулярном выражении.

Pattern.compile("(?m)^[\\s&&[^\\n]]+|[\\s+&&[^\\n]]+$");

Bam. Готово.

Вы также можете заменить весь код Сличитель с replaceAll вызова:

public static String trimWhiteSpaceFromTheBeginingAndEndOFTheLine(
    String string) { 
    return string.replaceAll("(?m)^[\\s&&[^\\n]]+|[\\s+&&[^\\n]]+$", ""); 
} 
+0

код trimo разрыва строки, например, если есть две разрывы между городом и Аландскими островами, две пустые строки являются обрезкой, которая не является то, что я хочу, чтобы только триммеры не были \ n \ n или \ n – molwiko

+0

Hm, он работает с одним '\ n', но' \ n \ n' прерывает его. Кажется, это ошибка с java regexes. О, подождите, \ n тоже в \ s. –

+1

@Molwiko Исправлено выражение –

0

Что-то вроде этого?

private void doTrim(String str) throws Exception { 
    StringBuilder sb = new StringBuilder(); 
    BufferedReader reader = new BufferedReader(new StringReader(str)); 
    String line; 
    String NL = System.getProperty("line.separator"); 
    while((line=reader.readLine())!=null) { 
     sb.append(line.trim()); 
     sb.append(NL); 
    } 
    System.out.println(">>" + str + "<<"); 
    str = sb.toString().trim(); 
    System.out.println(">>" + str + "<<"); 
} 

Или версия для хардкора для кодирования строковых символов и обновления нового буфера. Это позволит обрезать оконные окна «\ r \ n» для unix «\ n» новой строки. Небольшую оптимизацию idxTail newBuf можно было бы избежать и использовать только buf [].

private String trimLeadingAndTrailingSpaces(String str) { 
    char[] buf = str.toCharArray(); 
    char[] newBuf = new char[buf.length]; 
    int newCount=0; 
    boolean isBegin=true; 
    int trailingSpaces=0; 
    for(int idx=0; idx<buf.length; idx++) { 
     char ch = buf[idx]; 
     if (isBegin) { 
      if (ch!=' ') { 
       isBegin=false; 
       newBuf[newCount]=ch; 
       newCount++; 
      } 
     } else { 
      if (ch==' ' || ch=='\r') { 
       trailingSpaces++; 
      } else if (ch=='\n') { 
       if (trailingSpaces>0) newCount -= trailingSpaces; 
       trailingSpaces=0; 
       isBegin=true; 
      } else if (trailingSpaces>0) { 
       trailingSpaces=0; 
      } 
      newBuf[newCount]=ch; 
      newCount++; 
     } 
    } 
    return new String(newBuf, 0, newCount-trailingSpaces); 
} 
Смежные вопросы