2009-03-24 19 views
25

Tôi biết có rất nhiều phương pháp upper() trong Java và các khung công tác khác như Apache commons lang, chuyển đổi chuỗi thành tất cả các chữ hoa.Có phương pháp thư viện hiện có nào kiểm tra xem một chuỗi là tất cả chữ hoa hoặc chữ thường trong Java không?

Có thư viện chung nào cung cấp phương thức như isUpper(String s)isLower(String s), để kiểm tra xem tất cả các ký tự trong chuỗi có chữ hoa hoặc chữ thường không?

CHỈNH SỬA:

Nhiều câu trả lời hay về chuyển đổi thành Trên và so sánh với điều này. Tôi đoán tôi nên có một chút cụ thể hơn, và nói rằng tôi đã có suy nghĩ về điều đó, nhưng tôi đã hy vọng để có thể sử dụng một phương pháp hiện có cho việc này.

Nhận xét tốt về khả năng bao gồm điều này trong apache.commons.lang.StringUtils. Ai đó thậm chí đã gửi một bản vá (20090310). Hy vọng rằng chúng ta sẽ sớm thấy điều này. https://issues.apache.org/jira/browse/LANG-471

EDIT:

Những gì tôi cần phương pháp này cho, là để tận dụng tên của khách sạn mà thỉnh thoảng đến trong tất cả các chữ hoa. Tôi chỉ muốn tận dụng chúng nếu tất cả chúng đều thấp hơn hoặc cao hơn. tôi đã chạy vào vấn đề với ký tự phi lá thư đề cập trong một số bài viết, và đã kết thúc làm một cái gì đó như thế này:

private static boolean isAllUpper(String s) { 
    for(char c : s.toCharArray()) { 
     if(Character.isLetter(c) && Character.isLowerCase(c)) { 
      return false; 
     } 
    } 
    return true; 
} 

thảo luận này và các giải pháp khác nhau (với các vấn đề khác nhau), rõ ràng cho thấy rằng có một nhu cầu về một phương pháp vững chắc là phương pháp AllUpper (String s) trong commons.lang

Cho đến lúc đó, tôi đoán rằng cách tốt nhất để đi.

+1

có một cái nhìn @ https://issues.apache.org/jira/browse/LANG-471 để làm theo cho dù đó sẽ được thêm vào trong commons apache một ngày – chburd

Trả lời

5

ổi của CharMatchers xu hướng cung cấp các giải pháp rất ý nghĩa và hiệu quả để loại vấn đề.

CharMatcher.javaUpperCase().matchesAllOf("AAA"); // true 
CharMatcher.javaUpperCase().matchesAllOf("A SENTENCE"); // false 
CharMatcher.javaUpperCase().or(CharMatcher.whitespace()).matchesAllOf("A SENTENCE"); // true 
CharMatcher.javaUpperCase().or(CharMatcher.javaLetter().negate()).matchesAllOf("A SENTENCE"); // true 
CharMatcher.javaLowerCase().matchesNoneOf("A SENTENCE"); // true 

Nhập tĩnh cho com.google.common.base.CharMatcher.* có thể giúp làm cho gọn gàng hơn.

javaLowerCase().matchesNoneOf("A SENTENCE"); // true 
7

Không phải là tôi biết.

Bạn có thể sao chép chuỗi và chuyển đổi bản sao thành chữ hoa/thường và so sánh với bản gốc.

Hoặc tạo vòng lặp kiểm tra các ký tự đơn nếu trường hợp thấp hơn hoặc chữ hoa trên.

5

Phương pháp này có thể là nhanh hơn so với một String để phiên bản chữ hoa của nó như là nó đòi hỏi chỉ có 1 đường chuyền:

public static boolean isUpper(String s) 
{ 
    for(char c : s.toCharArray()) 
    { 
     if(! Character.isUpperCase(c)) 
      return false; 
    } 

    return true; 
} 

Xin lưu ý rằng có thể có một số vấn đề nội địa hóa với các bộ ký tự khác nhau. Tôi không có bất kỳ kinh nghiệm tay đầu tiên nhưng tôi nghĩ rằng có một số ngôn ngữ (như tiếng Thổ Nhĩ Kỳ), nơi các chữ cái chữ thường khác nhau có thể ánh xạ tới cùng một chữ hoa.

+0

Lưu ý rằng toCharArray() sẽ tạo ra một bản sao của chuỗi. Tôi đề nghị sử dụng chatAt cũ() thay thế. –

+0

Trong trường hợp trên và dưới của Thổ Nhĩ Kỳ như thường lệ, nó chỉ là ánh xạ khác với mọi ngôn ngữ khác. Cụ thể là "i" có nút chuyển âm sắc khi chuyển đổi vỏ. Eszet của Đức biến đổi thành hai ký tự khi tạo thành chữ hoa. –

+1

Nếu chuỗi chứa ký tự không phải chữ cái (chẳng hạn như "2"), phương pháp này không hữu ích. Nó có thể không hoạt động tốt với các chữ cái từ các bảng chữ cái không có chữ hoa/chữ thường hoặc các ký tự bổ sung (các điểm mã 32 bit). – McDowell

0

Bạn có thể sử dụng java.lang.Character.isUpperCase() Sau đó, bạn có thể dễ dàng viết một phương thức kiểm tra xem chuỗi của bạn có phải là chữ hoa hay không (với một vòng lặp đơn giản).

Gửi thư đếnUpperCase() đến chuỗi của bạn và sau đó kiểm tra xem kết quả bằng chuỗi của bạn có thể chậm hơn không.

+0

Điều này đòi hỏi phải xây dựng nhiều hơn. Việc sử dụng 'isUpperCase' bất cẩn sẽ dẫn đến việc triển khai thiếu sót. Xem các câu trả lời khác (và những cạm bẫy của họ). –

14

Thật không may là chức năng thư viện, nhưng khá dễ dàng để cuộn của riêng bạn. Nếu hiệu quả là một mối quan tâm, điều này có thể nhanh hơn s.toUpperCase() bằng (s) vì nó có thể bảo lãnh sớm.

public static boolean isUpperCase(String s) 
{ 
    for (int i=0; i<s.length(); i++) 
    { 
     if (!Character.isUpperCase(s.charAt(i))) 
     { 
      return false; 
     } 
    } 
    return true; 
} 

Edit: Như áp phích và bình luận khác đã lưu ý, chúng ta cần phải xem xét hành vi khi chuỗi chứa ký tự không phải chữ: nên isUpperCase ("hello1") trả về đúng hay sai? Hàm trên sẽ trả về false vì '1' không phải là ký tự chữ hoa, nhưng đây có thể không phải là hành vi bạn muốn. Một định nghĩa thay thế sẽ trả về true trong trường hợp này sẽ là:

public static boolean isUpperCase2(String s) 
{ 
    for (int i=0; i<s.length(); i++) 
    { 
     if (Character.isLowerCase(s.charAt(i))) 
     { 
      return false; 
     } 
    } 
    return true; 
} 
+0

+1 không phân bổ đối tượng –

+0

chức năng nhỏ tuyệt vời, thích nó! – Nicholas

+0

+1 'isUpperCase2' phải là câu trả lời được chấp nhận. Câu trả lời hiện tại của 'StringUtils.isAllUpperCase' không thành công cho các câu tự nhiên chữ hoa rõ ràng như chúng ta" KHÔNG LÀM VIỆC ", bởi vì' ''không phải là ký tự chữ hoa. –

2

Hãy thử điều này, có thể hữu ích.

import java.util.regex.Pattern; 

private static final String regex ="^[A-Z0-9]"; //alpha-numeric uppercase 
public static boolean isUpperCase(String str){ 
    return Pattern.compile(regex).matcher(str).find(); 
} 

với mã này, chúng tôi chỉ thay đổi regex.

+2

Chuỗi cuối cùng tĩnh riêng tư VALID_CODE = "^ [A-Z0-9] + $"; – TimP

+1

Regex đã cho chỉ kiểm tra sự bắt đầu của chuỗi. – TimP

+0

Chỉ cần 'str.matches (" [A-Z0-9] + ")' sẽ ngắn hơn và dễ đọc hơn. Và vì 'String # matches' ngầm thêm'^... & 'để khớp với toàn bộ Chuỗi, bạn cũng sẽ không cần regex đầy đủ'^[A-Z0-9] + $ 'được đề xuất bởi @TimP (mà bạn cần cho mã hiện tại của mình, vì bạn chỉ kiểm tra xem Chuỗi có bắt đầu bằng chữ hoa hay không, thay vì hoàn toàn bằng chữ hoa). –

15

Bây giờ trong StringUtils isAllUpperCase

+1

"CNTT KHÔNG LÀM VIỆC CHO STRING NÀY", và đoán tại sao :) –

+1

Nó hoạt động hoàn hảo theo tài liệu của nó; có một ví dụ được đưa ra: StringUtils.isAllUpperCase ("") = false – gerardw

+1

Nó không phải là lỗi, nếu đó là những gì bạn có ý nghĩa. Nó chỉ là nó không có khả năng hữu ích trong việc xử lý ngôn ngữ tự nhiên. Nó cũng dễ sửa chữa (xem câu trả lời của [Simon's] (http://stackoverflow.com/a/677592/147346)). –

5

này nếu điều kiện có thể nhận được kết quả mong đợi:

String input = "ANYINPUT"; 

if(input.equals(input.toUpperCase()) 
{ 
    // input is all upper case 
} 
else if (input.equals(input.toLowerCase()) 
{ 
    // input is all lower case 
} 
else 
{ 
    // input is mixed case 
} 
+0

Điều này không xử lý bất kỳ chuỗi nào có thể. Thay vào đó, điều này chỉ xử lý một tập hợp các chuỗi đã biết và tôi giả sử OP muốn một cái gì đó hoạt động với bất kỳ chuỗi nào –

+2

@ sigmavirus24 Trường hợp nào nó không xử lý được? –

Các vấn đề liên quan