Java cách thay thế 2 hoặc nhiều khoảng trắng bằng một khoảng trắng trong chuỗi và xóa các khoảng trắng ở đầu và cuối


271

Tìm kiếm cách đơn giản, nhanh chóng trong Java để thay đổi chuỗi này

" hello     there   "

đến một cái gì đó trông như thế này

"hello there"

nơi tôi thay thế tất cả nhiều khoảng trắng đó bằng một khoảng trắng, ngoại trừ tôi cũng muốn một hoặc nhiều khoảng trắng ở đầu chuỗi biến mất.

Một cái gì đó như thế này giúp tôi một phần ở đó

String mytext = " hello     there   ";
mytext = mytext.replaceAll("( )+", " ");

nhưng không hoàn toàn


5
Bạn nên xem xét chấp nhận một câu trả lời. Nó giúp mọi người đến trang sau dễ dàng hơn nhiều để chọn giải pháp dứt khoát.
Paul Rooney

1
Đây là một trong những cách được khuyến nghị nhất. =>. Chuỗi tênWithProperSpaces = StringUtils.n normalizeSpace (stringWithLotOfSpaces);
Kunal Vohra

s = s.replaceAll ("\\ s +", "");
Saroj Kumar Sahoo

Câu trả lời:


459

Thử cái này:

String after = before.trim().replaceAll(" +", " ");

Xem thêm


Không có trim()regex

Cũng có thể làm điều này chỉ với một replaceAll, nhưng điều này ít dễ đọc hơn trim()giải pháp. Tuy nhiên, nó được cung cấp ở đây chỉ để cho thấy regex có thể làm gì:

    String[] tests = {
        "  x  ",          // [x]
        "  1   2   3  ",  // [1 2 3]
        "",               // []
        "   ",            // []
    };
    for (String test : tests) {
        System.out.format("[%s]%n",
            test.replaceAll("^ +| +$|( )+", "$1")
        );
    }

Có 3 lựa chọn thay thế:

  • ^_+ : bất kỳ chuỗi khoảng trắng nào ở đầu chuỗi
    • Khớp và thay thế bằng $1, bắt chuỗi rỗng
  • _+$ : bất kỳ chuỗi khoảng trắng nào ở cuối chuỗi
    • Khớp và thay thế bằng $1, bắt chuỗi rỗng
  • (_)+ : bất kỳ chuỗi không gian nào khớp với không ở trên, có nghĩa là ở giữa
    • Khớp và thay thế bằng $1, bắt một khoảng trắng

Xem thêm


11
+1, đặc biệt là đáng chú ý là làm trim()và sau đó replaceAll()sử dụng ít bộ nhớ hơn so với thực hiện theo cách khác. Không nhiều, nhưng nếu điều này được gọi nhiều lần, nó có thể tăng lên, đặc biệt là nếu có nhiều "khoảng trắng có thể điều chỉnh". ( Trim()không thực sự thoát khỏi không gian thừa - nó chỉ che giấu nó bằng cách di chuyển các giá trị bắt đầu và kết thúc. Phần cơ bản char[]vẫn không thay đổi.)
corsiKa

2
Đó chỉ là một chi tiết, nhưng tôi nghĩ rằng ( ) +hoặc ( ){2,}nên là một (rất) hiệu quả hơn một chút;)
sp00m

6
Đẹp regrec. Lưu ý: thay thế \\skhoảng trắng `` bằng sẽ thay thế bất kỳ nhóm khoảng trắng nào bằng ký tự mong muốn.
djmj

1
Lưu ý rằng phần () + sẽ khớp với một khoảng trắng và thay thế nó bằng một khoảng trắng. Có lẽ (<dấu cách> <dấu cách> +) sẽ tốt hơn nên nó chỉ khớp nếu có nhiều khoảng trắng và sự thay thế sẽ tạo ra một thay đổi thực cho chuỗi.
Lee Meador

1
Như Lee Meador đã đề cập, .trim().replaceAll(" +", " ")(có hai khoảng trắng) nhanh hơn .trim().replaceAll(" +", " ")(với một khoảng trắng ). Tôi đã chạy thử nghiệm thời gian trên các chuỗi chỉ có không gian đơn và tất cả không gian đôi và nó nhanh hơn đáng kể cho cả hai khi thực hiện nhiều thao tác (hàng triệu hoặc nhiều hơn, tùy thuộc vào môi trường).
Gary S. Weaver

154

Bạn chỉ cần một:

replaceAll("\\s{2,}", " ").trim();

trong đó bạn khớp một hoặc nhiều khoảng trắng và thay thế chúng bằng một khoảng trắng và sau đó cắt các khoảng trắng ở đầu và cuối (bạn thực sự có thể đảo ngược bằng cách cắt đầu tiên và sau đó khớp để làm cho biểu thức nhanh hơn như ai đó đã chỉ ra).

Để kiểm tra điều này một cách nhanh chóng hãy thử:

System.out.println(new String(" hello     there   ").trim().replaceAll("\\s{2,}", " "));

và nó sẽ trở lại:

"hello there"

3
Tôi có thể cắt trước vì sau đó bạn sẽ tiết kiệm được một chút công việc.
Michael

3
@ sarah.ferguson Vui lòng xóa dấu ngoặc cuối cùng ")" không nên có trong phần thay thế đầu tiên. Cảm ơn. - Hệ thống sẽ không cho phép tôi làm điều đó! (Không có gì dưới 6 ký tự đủ điều kiện để chỉnh sửa ..)
mwarren

2
Lưu ý rằng điều này sẽ thay thế một không gian bằng một không gian khác trong trường hợp không có nhiều không gian với nhau. Không cần phải thay thế trong trường hợp đó mặc dù bạn có thể muốn nó vì bạn cũng đang thay thế một tab bằng một khoảng trắng. Sẽ thật tốt khi chỉ nhận ra nhiều không gian mà thôi.
Lee Meador

2
@geowar câu hỏi xin lỗi ở đâu? Tôi chắc chắn những điều trên không thay thế ☮ biểu tượng cho vấn đề đó .. và cả ✌ ...
sarah.ferguson

2
chờ một giây @geowar Điều này không thay thế một bảng duy nhất bằng một khoảng trắng. Tôi vừa thử nó
user1870400


20

Điều này làm việc hoàn hảo cho tôi: sValue = sValue.trim().replaceAll("\\s+", " ");


1
Mọi người chỉnh sửa câu trả lời của tôi. Bản gốc là: sValue = sValue.replaceAll ("\ s +", "") .trim ();
Bác sĩ

2
Đã được chỉnh sửa vì câu trả lời ban đầu của bạn sẽ xóa tất cả các khoảng trắng và đó không phải là những gì OP yêu cầu
Jose Rui Santos

17
"[ ]{2,}"

Điều này sẽ phù hợp với nhiều hơn một không gian.

String mytext = " hello     there   ";
//without trim -> " hello there"
//with trim -> "hello there"
mytext = mytext.trim().replaceAll("[ ]{2,}", " ");
System.out.println(mytext);

ĐẦU RA:

hello there

13

Để loại bỏ khoảng trắng ở đầu và cuối Chuỗi, hãy sử dụng String#trim()phương thức. Và sau đó sử dụng của bạn mytext.replaceAll("( )+", " ").


12

Trước tiên String.trim(), bạn có thể sử dụng , và sau đó áp dụng lệnh thay thế regex trên kết quả.


10
trim () sẽ xóa tất cả khoảng
trắng

10

Đoạn mã sau sẽ thu gọn bất kỳ khoảng trắng nào giữa các từ và xóa bất kỳ khoảng trống nào ở đầu và cuối của chuỗi

String input = "\n\n\n  a     string with     many    spaces,    \n"+
               " a \t tab and a newline\n\n";
String output = input.trim().replaceAll("\\s+", " ");
System.out.println(output);

Điều này sẽ xuất a string with many spaces, a tab and a newline

Lưu ý rằng mọi ký tự không in được, bao gồm dấu cách, tab và dòng mới sẽ được nén hoặc xóa


Để biết thêm thông tin xem tài liệu tương ứng:


9

Hãy thử cái này

Mã mẫu

String str = " hello     there   ";
System.out.println(str.replaceAll("( +)"," ").trim());

ĐẦU RA

hello there

Đầu tiên, nó sẽ thay thế tất cả các không gian bằng không gian duy nhất. Hơn chúng ta phải cắt tỉa Stringvì Bắt đầu Stringvà Kết thúc, Stringnó sẽ thay thế toàn bộ không gian bằng một không gian duy nhất nếu Stringcó khoảng trống ở Bắt đầu Stringvà Kết thúc StringVì vậy chúng ta cần cắt bớt chúng. Hơn bạn có được mong muốn của bạn String.


4

Bạn cũng có thể sử dụng lookaround.

test.replaceAll("^ +| +$|(?<= ) ", "");

HOẶC LÀ

test.replaceAll("^ +| +$| (?= )", "")

<space>(?= )phù hợp với một nhân vật không gian được theo sau bởi một nhân vật không gian khác. Vì vậy, trong các không gian liên tiếp, nó sẽ khớp với tất cả các khoảng trắng ngoại trừ cuối cùng bởi vì nó không được theo sau bởi một ký tự khoảng trắng. Điều này để lại cho bạn một không gian duy nhất cho các không gian liên tiếp sau thao tác xóa.

Thí dụ:

    String[] tests = {
            "  x  ",          // [x]
            "  1   2   3  ",  // [1 2 3]
            "",               // []
            "   ",            // []
        };
        for (String test : tests) {
            System.out.format("[%s]%n",
                test.replaceAll("^ +| +$| (?= )", "")
            );
        }

Cách bạn có nó, nó sẽ khớp với bất kỳ (các) không gian nào ở mặt trước hoặc cuối hoặc bất kỳ không gian nào với không gian khác sau nó. Điều đó có nghĩa là "a .... b" sẽ khớp 3 lần và thay thế ba lần. Nó lặp đi lặp lại trên tất cả các không gian bên trong bên trong phương thức thay thế (). Có lẽ bạn có thể thay đổi nó để phù hợp với bất kỳ chuỗi 2 hoặc nhiều khoảng trống cùng một lúc và giảm số lần lặp bên trong.
Lee Meador

Có lẽ <dấu cách> + (? = <Dấu cách>) sẽ làm điều đó.
Lee Meador

4

cắt ()

Chỉ xóa các không gian hàng đầu và dấu.

Từ Java Doc, "Trả về một chuỗi có giá trị là chuỗi này, với bất kỳ khoảng trắng hàng đầu và dấu kiểm nào bị xóa."

System.out.println(" D ev  Dum my ".trim());

"D ev Dum my"

thay thế (), thayTất cả ()

Thay thế tất cả các chuỗi trống trong từ,

System.out.println(" D ev  Dum my ".replace(" ",""));

System.out.println(" D ev  Dum my ".replaceAll(" ",""));

System.out.println(" D ev  Dum my ".replaceAll("\\s+",""));

Đầu ra:

"DevDummy"

"DevDummy"

"DevDummy"

Lưu ý: "\ s +" là biểu thức chính quy tương tự ký tự khoảng trống.

Tham khảo: https://www.codingjava.com/2018/06/replace-all-spaces-in-opes-trim.html


4

Rất nhiều câu trả lời đúng đã được cung cấp cho đến nay và tôi thấy rất nhiều câu trả lời. Tuy nhiên, các cách được đề cập sẽ hoạt động nhưng không thực sự tối ưu hóa hoặc không thực sự có thể đọc được. Gần đây tôi đã bắt gặp giải pháp mà mọi nhà phát triển sẽ thích.

String nameWithProperSpacing = StringUtils.normalizeSpace( stringWithLotOfSpaces );

Bạn xong việc rồi. Đây là giải pháp dễ đọc.


3

Trong Kotlin nó sẽ trông như thế này

val input = "\n\n\n  a     string with     many    spaces,    \n"
val cleanedInput = input.trim().replace(Regex("(\\s)+"), " ")

2
String str = " hello world"

giảm không gian đầu tiên

str = str.trim().replaceAll(" +", " ");

viết hoa chữ cái đầu tiên và viết thường mọi thứ khác

str = str.substring(0,1).toUpperCase() +str.substring(1,str.length()).toLowerCase();

1

Điều này làm việc cho tôi

scan= filter(scan, " [\\s]+", " ");
scan= sac.trim();

trong đó bộ lọc theo chức năng và quét là chuỗi đầu vào:

public String filter(String scan, String regex, String replace) {
    StringBuffer sb = new StringBuffer();

    Pattern pt = Pattern.compile(regex);
    Matcher m = pt.matcher(scan);

    while (m.find()) {
        m.appendReplacement(sb, replace);
    }

    m.appendTail(sb);

    return sb.toString();
}

1
Điều này sẽ thay thế <dấu cách> <tab> bằng dấu cách nhưng không phải <tab> <tab>. Đó là một vấn đề nhỏ, có vẻ như.
Lee Meador

1

bạn nên làm nó như thế này

String mytext = " hello     there   ";
mytext = mytext.replaceAll("( +)", " ");

đặt + bên trong dấu ngoặc tròn.


1
String str = "  this is string   ";
str = str.replaceAll("\\s+", " ").trim();

1
mytext = mytext.replaceAll("\\s+"," ");

Câu trả lời chỉ có mã được khuyến khích. Vui lòng nhấp vào chỉnh sửa và thêm một số từ tóm tắt cách mã của bạn giải quyết câu hỏi hoặc có thể giải thích câu trả lời của bạn khác với các câu trả lời trước đó như thế nào. Cảm ơn
Nick

0

Xem String.replaceAll.

Sử dụng regex "\s"và thay thế bằng " ".

Sau đó sử dụng String.trim.


1
Chuỗi mới ("xin chào") .replaceAll ("\\ s", "+") trả về một + xin chào +++++++ ở đó +++ nên chắc chắn không hoạt động ..
sarah.ferguson

1
Hãy thửnew String(" hello there ").trim().replaceAll("\\s+", " ")
manish_s

0

kiểm tra điều này...

public static void main(String[] args) {
    String s = "A B  C   D    E F      G\tH I\rJ\nK\tL";
    System.out.println("Current      : "+s);
    System.out.println("Single Space : "+singleSpace(s));
    System.out.println("Space  count : "+spaceCount(s));
    System.out.format("Replace  all = %s", s.replaceAll("\\s+", ""));

    // Example where it uses the most.
    String s = "My name is yashwanth . M";
    String s2 = "My nameis yashwanth.M";

    System.out.println("Normal  : "+s.equals(s2));
    System.out.println("Replace : "+s.replaceAll("\\s+", "").equals(s2.replaceAll("\\s+", "")));

} 

Nếu Chuỗi chỉ chứa một không gian thì thay thế () sẽ không thay thế,

Nếu khoảng trắng nhiều hơn một, thì hành động thay thế () sẽ thực hiện và loại bỏ không gian.

public static String singleSpace(String str){
    return str.replaceAll("  +|   +|\t|\r|\n","");
}

Để đếm số lượng khoảng trắng trong Chuỗi.

public static String spaceCount(String str){
    int i = 0;
    while(str.indexOf(" ") > -1){
      //str = str.replaceFirst(" ", ""+(i++));
        str = str.replaceFirst(Pattern.quote(" "), ""+(i++)); 
    }
    return str;
}

Mẫu .quote ("?") Trả về chuỗi mẫu bằng chữ.


0

Phương pháp của tôi trước khi tôi tìm thấy câu trả lời thứ hai bằng cách sử dụng regex như một giải pháp tốt hơn. Có lẽ ai đó cần mã này.

private String replaceMultipleSpacesFromString(String s){
    if(s.length() == 0 ) return "";

    int timesSpace = 0;
    String res = "";

    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);

        if(c == ' '){
            timesSpace++;
            if(timesSpace < 2)
                res += c;
        }else{
            res += c;
            timesSpace = 0;
        }
    }

    return res.trim();
}

Thú vị, nhưng không gian màu trắng có nghĩa là nhiều hơn chỉ là khoảng trống.
Laur Ivan

@LaurIvan có nghĩa là gì?
trinity420

mục này có một lời giải thích tốt về những gì \sđại diện cho các biểu thức thông thường (dấu cách, tab, dòng mới, nguồn cấp dữ liệu biểu mẫu).
Laur Ivan

@LaurIvan Liên kết của bạn bị hỏng nhưng bạn đã đúng. Vấn đề này có thể được giải quyết bằng cách lặp qua chuỗi đầu vào, loại bỏ mọi ký tự không phải là chữ cái, không số và không khoảng trắng, tôi nghĩ vậy.
trinity420

0

Luồng phiên bản, lọc không gian và các tab.

Stream.of(str.split("[ \\t]")).filter(s -> s.length() > 0).collect(Collectors.joining(" "))

0
String myText = "   Hello     World   ";
myText = myText.trim().replace(/ +(?= )/g,'');


// Output: "Hello World"

0

Phương pháp đơn giản nhất để loại bỏ khoảng trắng ở bất cứ đâu trong chuỗi.

 public String removeWhiteSpaces(String returnString){
    returnString = returnString.trim().replaceAll("^ +| +$|( )+", " ");
    return returnString;
}

-1
public class RemoveExtraSpacesEfficient {

    public static void main(String[] args) {

        String s = "my    name is    mr    space ";

        char[] charArray = s.toCharArray();

        char prev = s.charAt(0);

        for (int i = 0; i < charArray.length; i++) {
            char cur = charArray[i];
            if (cur == ' ' && prev == ' ') {

            } else {
                System.out.print(cur);
            }
            prev = cur;
        }
    }
}

Giải pháp trên là thuật toán với độ phức tạp của O (n) mà không sử dụng bất kỳ hàm java nào.


-1

Vui lòng sử dụng mã dưới đây

package com.myjava.string;

import java.util.StringTokenizer;

public class MyStrRemoveMultSpaces {

    public static void main(String a[]){

        String str = "String    With Multiple      Spaces";

        StringTokenizer st = new StringTokenizer(str, " ");

        StringBuffer sb = new StringBuffer();

        while(st.hasMoreElements()){
            sb.append(st.nextElement()).append(" ");
        }

        System.out.println(sb.toString().trim());
    }
}

-1

Xin lỗi xin lỗi vì sự chậm trễ! Dưới đây là câu trả lời tốt nhất và hiệu quả nhất mà bạn đang tìm kiếm:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MyPatternReplace {

public String replaceWithPattern(String str,String replace){

    Pattern ptn = Pattern.compile("\\s+");
    Matcher mtch = ptn.matcher(str);
    return mtch.replaceAll(replace);
}

public static void main(String a[]){
    String str = "My    name    is  kingkon.  ";
    MyPatternReplace mpr = new MyPatternReplace();
    System.out.println(mpr.replaceWithPattern(str, " "));
}

Vì vậy, đầu ra của bạn của ví dụ này sẽ là: Tên tôi là kingkon.

Tuy nhiên, phương thức này cũng sẽ loại bỏ "\ n" mà chuỗi của bạn có thể có. Vì vậy, nếu bạn không muốn điều đó chỉ cần sử dụng phương pháp đơn giản này:

while (str.contains("  ")){  //2 spaces
str = str.replace("  ", " "); //(2 spaces, 1 space) 
}

Và nếu bạn muốn loại bỏ các khoảng trắng hàng đầu và dấu, chỉ cần thêm:

str = str.trim();

-1

Tôi biết phương pháp thay thế là dễ dàng hơn nhiều nhưng tôi cũng muốn đăng bài này.

public static String removeExtraSpace(String input) {
    input= input.trim();
    ArrayList <String> x= new ArrayList<>(Arrays.asList(input.split("")));
    for(int i=0; i<x.size()-1;i++) {
        if(x.get(i).equals(" ") && x.get(i+1).equals(" ")) { 
            x.remove(i); 
            i--; 
        }
    }
    String word="";
    for(String each: x) 
        word+=each;
    return word;
}

1
Mặc dù điều này hoạt động, nó là xa giải pháp dễ dàng nhất.
Platzhersh

-1

Chuỗi mã thông báo có thể được sử dụng

 String str = "  hello    there  ";
            StringTokenizer stknzr = new StringTokenizer(str, " ");
            StringBuffer sb = new StringBuffer();
            while(stknzr.hasMoreElements())
            {
                sb.append(stknzr.nextElement()).append(" ");
            }
            System.out.println(sb.toString().trim());
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.