Làm cách nào để kiểm tra xem Chuỗi Java không phải là tất cả các khoảng trắng?


132

Tôi muốn kiểm tra xem Chuỗi Java hoặc mảng ký tự không chỉ được tạo thành từ các khoảng trắng, sử dụng Java?

Đây là một câu hỏi tương tự ngoại trừ Javascript:
Làm cách nào để kiểm tra xem chuỗi có chứa ký tự & khoảng trắng không, không chỉ khoảng trắng?

EDIT : Tôi đã loại bỏ một chút về các ký tự chữ và số, vì vậy nó có ý nghĩa hơn.


3
Xin lưu ý rằng có nhiều định nghĩa khác nhau về khoảng trắng: sheetsheet.google.com/pub?key=pd8dAQyHbdewRsnE5x5GzKQ Bạn muốn gì? Hoặc sau đó bạn nói "có một ký tự chữ và số", đó là một điều hoàn toàn khác. Vui lòng làm rõ.
Kevin Bourrillion

Xin lỗi vì sự nhầm lẫn ... không phải tất cả các khoảng trắng là chìa khóa - về cơ bản nếu nó có tất cả các ký tự khoảng trắng tôi muốn loại trừ nó, bởi vì nó không có nội dung.
Ankur

1
Với JDK / 11, bạn có thể sử dụngString.isBlank API tương tự.
Naman

Câu trả lời:


224

Giải pháp ngắn nhất tôi có thể nghĩ ra:

if (string.trim().length() > 0) ...

Điều này chỉ kiểm tra (không) khoảng trắng. Nếu bạn muốn kiểm tra các lớp ký tự cụ thể, bạn cần sử dụng hùng mạnh match()với biểu thức chính quy như:

if (string.matches(".*\\w.*")) ...

... Kiểm tra ít nhất một ký tự chữ và số (ASCII).


9
FWIW: Tôi hy vọng giải pháp đầu tiên sẽ nhanh hơn đáng kể.
Stephen C

2
@Stephen C: Hoàn toàn đúng! Nhưng như @Uri đã chỉ ra, tôi phải giải quyết hai vấn đề khác nhau nhờ sự mơ hồ của câu hỏi :) Ngoài ra, tôi hiếm khi sử dụng matches(): để thực hiện, tôi thường lưu trữ Patterntrong a final static. Trả tiền nếu cùng mã chạy thường xuyên.
Carl Smotricz

3
@Andreas_D: Heh, tôi đã nhận được đơn đặt hàng của mình! OP cho biết anh muốn kiểm tra một chuỗi hoặc mảng char, anh không bao giờ nói bất cứ điều gì về null! :) * kiểm tra bản in đẹp trong hợp đồng * " nullkhông phải là một chuỗi!"
Carl Smotricz

1
Ngoài ra, "\\ w" chỉ khớp với một tập hợp con giới hạn của các ký tự không phải khoảng trắng thay vì tất cả các khoảng trắng vì nó đề cập đến "các ký tự từ" được định nghĩa là AZ, az, 0-9 và gạch dưới.
Rob Raisch

2
Tôi đã sử dụng your_opes.trim (). IsEmpty () và đã thực hiện công việc cho tôi
Neri

59

Tôi sẽ sử dụng thư viện Apache Commons Lang. Nó có một lớp được gọi là StringUtils hữu ích cho tất cả các loại hoạt động của Chuỗi. Để kiểm tra xem một Chuỗi không phải là tất cả các khoảng trắng, bạn có thể sử dụng như sau:

StringUtils.isBlank(<your string>)

Đây là tài liệu tham khảo: StringUtils.isBlank


8
Tôi thích giải pháp này so với việc sử dụng câu trả lời đã chọn. Điều này cũng sẽ kiểm tra chuỗi == null
Richard

Điều này bây giờ không chính xác. StringUtils.isEmptybây giờ sẽ trả về false nếu bạn chuyển vào "".
James Spence

53

Hơi ngắn hơn so với những gì được đề cập bởi Carl Smotricz:

!string.trim().isEmpty();

10
Bạn là chủ hàng trẻ tuổi và mánh khóe hậu Java-1.6 mới lạ của bạn! Nghiêm túc mà nói, ít nhất một dự án trong công ty của tôi vẫn chạy trên Java 1.4 (thở dài).
Carl Smotricz

Ngắn hơn? Đúng. Cá nhân, tôi thích phong cách mã hóa dài dòng hơn
Michel


9

Nếu bạn đang sử dụng Java 11 , isBlankphương thức chuỗi mới sẽ có ích:

!s.isBlank();

Nếu bạn đang sử dụng Java 8, 9 hoặc 10 , bạn có thể xây dựng một luồng đơn giản để kiểm tra xem một chuỗi không chỉ là khoảng trắng:

!s.chars().allMatch(Character::isWhitespace));

Ngoài việc không yêu cầu bất kỳ thư viện của bên thứ ba nào như Apache Commons Lang, các giải pháp này có lợi thế là xử lý bất kỳ ký tự khoảng trắng nào, và không chỉ là các ' 'không gian đơn giản như một trimgiải pháp dựa trên đề xuất trong nhiều câu trả lời khác. Bạn có thể tham khảo Javadocs để biết danh sách đầy đủ tất cả các loại khoảng trắng được hỗ trợ. Lưu ý rằng các chuỗi trống cũng được bao phủ trong cả hai trường hợp.


5
if(target.matches("\\S")) 
    // then string contains at least one non-whitespace character

Lưu ý sử dụng back-slash cap-S, có nghĩa là "char không phải khoảng trắng"

Tôi muốn đặt cược đây là giải pháp đơn giản nhất (và có lẽ là nhanh nhất?).


2
Hãy thử: String year="1995"; year.matches("\\S"); will return falseVì vậy, đây không phải là giải pháp chính xác. : |
Nhất Định

6
Nhất, bạn đúng mặc dù tôi không thể giải thích được tại sao. Theo các tài liệu Java, String.matches kiểm tra xem một chuỗi đã cho có khớp với biểu thức chính quy không. Một thử nghiệm nhỏ cho thấy rằng điều này không hoàn toàn chính xác, vì chức năng này dường như chỉ khớp với nếu regex được cung cấp khớp với chuỗi ENTIRE! Vì vậy, việc thay đổi regex ở trên ("\\ S") thành "^. * \\ S. * $" Sẽ hoạt động như mong đợi, mặc dù hành vi này không được ghi lại một cách chính xác và dường như phân kỳ đáng kể từ mọi triển khai khớp chuỗi khác sử dụng biểu thức chính quy.
Rob Raisch

4

Câu trả lời này tập trung nhiều hơn vào sidenote " tức là có ít nhất một ký tự chữ và số ". Ngoài ra, nó không thêm quá nhiều vào giải pháp khác (trước đó), ngoại trừ việc nó không làm tổn thương bạn với NPE trong trường hợp String là null.

Chúng tôi muốn falsenếu (1) s là nullhoặc (2) s trống hoặc (3) s chỉ chứa whitechars.

public static boolean containsNonWhitespaceChar(String s) {
  return !((s == null) || "".equals(s.trim()));
}

4

Nếu bạn chỉ kiểm tra khoảng trắng và không quan tâm đến null thì bạn có thể sử dụng org.apache.commons.lang.StringUtils.isWhitespace (String str),

StringUtils.isWhitespace(String str);

(Kiểm tra nếu Chuỗi chỉ chứa khoảng trắng.)

Nếu bạn cũng muốn kiểm tra null (bao gồm cả khoảng trắng) thì

StringUtils.isBlank(String str);

isBlank (String) được khuyến nghị vì nó cũng xử lý xác thực null!
Sachidananda Naik

2

Với Java-11 +, bạn có thể sử dụng String.isBlankAPI để kiểm tra xem chuỗi đã cho không phải là tất cả được tạo thành từ khoảng trắng -

String str1 = "    ";
System.out.println(str1.isBlank()); // made up of all whitespaces, prints true

String str2 = "    a";
System.out.println(str2.isBlank()); // prints false

Các javadoc cho cùng là:

/**
 * Returns {@code true} if the string is empty or contains only
 * {@link Character#isWhitespace(int) white space} codepoints,
 * otherwise {@code false}.
 *
 * @return {@code true} if the string is empty or contains only
 *         {@link Character#isWhitespace(int) white space} codepoints,
 *         otherwise {@code false}
 *
 * @since 11
 */
public boolean isBlank()

1

Phương pháp cắt nên làm việc tuyệt vời cho bạn.

http://doad.oracle.com/docs/cd/E17476_01/javase/1.4.2/docs/api/java/lang/String.html#trim ()

Trả về một bản sao của chuỗi, với khoảng trắng ở đầu và cuối được bỏ qua. Nếu đối tượng Chuỗi này biểu thị một chuỗi ký tự trống hoặc các ký tự đầu tiên và cuối cùng của chuỗi ký tự được đại diện bởi đối tượng Chuỗi này đều có mã lớn hơn '\ u0020' (ký tự khoảng trắng), thì sẽ trả về tham chiếu đến đối tượng Chuỗi này.

Mặt khác, nếu không có ký tự nào có mã lớn hơn '\ u0020' trong chuỗi, thì một đối tượng Chuỗi mới đại diện cho một chuỗi trống được tạo và trả về.

Mặt khác, hãy để k là chỉ mục của ký tự đầu tiên trong chuỗi có mã lớn hơn '\ u0020' và gọi m là chỉ mục của ký tự cuối cùng trong chuỗi có mã lớn hơn '\ u0020'. Một đối tượng Chuỗi mới được tạo, đại diện cho chuỗi con của chuỗi này bắt đầu bằng ký tự ở chỉ số k và kết thúc bằng ký tự ở chỉ số m - đó là kết quả của chuỗi này.sub chuỗi (k, m + 1).

Phương pháp này có thể được sử dụng để cắt khoảng trắng từ đầu và cuối chuỗi; trên thực tế, nó cũng cắt tất cả các ký tự điều khiển ASCII.

Trả về: Một bản sao của chuỗi này với khoảng trắng ở đầu và cuối được loại bỏ hoặc chuỗi này nếu nó không có khoảng trắng ở đầu hoặc cuối.

Bạn có thể cắt và sau đó so sánh với một chuỗi trống hoặc có thể kiểm tra độ dài cho 0.


Liên kết trong câu trả lời đã chết - 404 | Rất tiếc, trang này không tồn tại hoặc không còn tồn tại .
Pang

0

Thay thế:

boolean isWhiteSpaces( String s ) {
    return s != null && s.matches("\\s+");
 }

1
\\ s * sẽ khớp với tất cả các chuỗi có hoặc không có khoảng trắng. Có lẽ bạn có nghĩa là \ s +?
Rob Raisch

0

trim () và biểu thức chính quy được đề cập khác không hoạt động đối với tất cả các loại khoảng trắng

tức là: Ký tự Unicode 'LINE SEPARATOR' http://www.fileformat.info/info/unicode/char/2028/index.htmlm

Các hàm Java Character.isWhitespace () bao gồm tất cả các tình huống.

Đó là lý do tại sao đã đề cập đến giải pháp StringUtils.isWhitespace (String) / hoặc StringUtils.isBlank (String) nên được sử dụng.


0
StringUtils.isEmptyOrWhitespaceOnly(<your string>)

sẽ kiểm tra: - có phải là null không - có phải chỉ là không gian - là chuỗi rỗng ""

https://www.programcalet.com/java-api-examples/?group=com.mysql.jdbc.StringUtils&method=isEmptyOrWhitespaceOnly


1
Đây có phải là từ một thư viện? Liên kết với dự án. Hoặc được xây dựng trong Java? Chỉ ra gói.
Basil Bourque

@BasilBourque Tôi nghĩ rằng đây là com.mysql.jdbc.StringUtils.isEmptyOrWhitespaceOnly
ahmet_y

0

Chỉ là một so sánh hiệu suất trên openjdk 13, Windows 10. Đối với mỗi văn bản sau:

"abcd"
"    "
" \r\n\t"
" ab "
" \n\n\r\t   \n\r\t\t\t   \r\n\r\n\r\t \t\t\t\r\n\n"
"lorem ipsum dolor sit amet  consectetur adipisici elit"
"1234657891234567891324569871234567891326987132654798"

thực hiện một trong các thử nghiệm sau:

// trim + empty
input.trim().isEmpty()

// simple match
input.matches("\\S")

// match with precompiled pattern
final Pattern PATTERN = Pattern.compile("\\S");
PATTERN.matcher(input).matches()

// java 11's isBlank
input.isBlank()

mỗi 10.000.000 lần.

Kết quả:

METHOD    min   max   note
trim:      18   313   much slower if text not trimmed
match:   1799  2010   
pattern:  571   662   
isBlank:   60   338   faster the earlier hits the first non-whitespace character

Khá ngạc nhiên khi cắt + trống là nhanh nhất. Ngay cả khi nó cần để xây dựng văn bản cắt. Vẫn nhanh hơn sau đó đơn giản tìm vòng lặp tìm kiếm một ký tự không có khoảng trắng ...

EDIT: Văn bản càng dài, số lượng càng khác nhau. Cắt văn bản dài mất nhiều thời gian hơn chỉ là vòng lặp đơn giản. Tuy nhiên, regexs vẫn là giải pháp chậm nhất.


0

Trong khi cá nhân tôi sẽ thích !str.isBlank(), như những người khác đã đề xuất (hoặc str -> !str.isBlank()với tư cách là Vị ngữ), một phiên bản hiện đại và hiệu quả hơn của str.trim()cách tiếp cận được đề cập ở trên, sẽ được sử dụng str.strip()- coi null là "khoảng trắng":

if (str != null && str.strip().length() > 0) {...}

Ví dụ như Dự đoán, để sử dụng với các luồng, ví dụ: trong bài kiểm tra đơn vị:

@Test
public void anyNonEmptyStrippedTest() {
    String[] strings = null;
    Predicate<String> isNonEmptyStripped = str -> str != null && str.strip().length() > 0;
    assertTrue(Optional.ofNullable(strings).map(arr -> Stream.of(arr).noneMatch(isNonEmptyStripped)).orElse(true));
    strings = new String[] { null, "", " ", "\\n", "\\t", "\\r" };
    assertTrue(Optional.ofNullable(strings).map(arr -> Stream.of(arr).anyMatch(isNonEmptyStripped)).orElse(true));
    strings = new String[] { null, "", " ", "\\n", "\\t", "\\r", "test" };
}
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.