2012-12-24 40 views
131

Có thể xác định xem một chuỗi str1="ABCDEFGHIJKLMNOP" có chứa mẫu chuỗi strptrn="gHi" không? Tôi muốn biết nếu điều đó có thể xảy ra khi các nhân vật không phân biệt chữ hoa chữ thường. Nếu vậy, làm thế nào?Chuỗi chứa - bỏ qua trường hợp

+1

sử dụng toUpperCase() ?? – Ravi

Trả lời

195

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

org.apache.commons.lang3.StringUtils.containsIgnoreCase(CharSequence str, 
            CharSequence searchStr); 

Kiểm tra xem CharSequence có chứa tìm kiếm CharSequenc không e không phân biệt trường hợp , xử lý null. Phân biệt chữ hoa chữ thường được định nghĩa là String.equalsIgnoreCase (Chuỗi).

Một CharSequence rỗng sẽ trả về false.

Điều này sẽ tốt hơn regex là regex luôn đắt tiền về hiệu suất.

Đối doc chính thức, tham khảo: StringUtils.containsIgnoreCase

Cập nhật:

Nếu bạn nằm trong số những người

  • không muốn sử dụng Apache commons thư viện
  • don không muốn đi với các giải pháp dựa trên regex/Pattern tốn kém đắt tiền,
  • không muốn tạo đối tượng chuỗi bổ sung bằng cách sử dụng toLowerCase,

bạn có thể thực hiện tùy chỉnh của riêng bạn containsIgnoreCase sử dụng java.lang.String.regionMatches

public boolean regionMatches(boolean ignoreCase, 
          int toffset, 
          String other, 
          int ooffset, 
          int len) 

ignoreCase: nếu đúng, bỏ qua trường hợp khi so sánh ký tự.

public static boolean containsIgnoreCase(String str, String searchStr)  { 
    if(str == null || searchStr == null) return false; 

    final int length = searchStr.length(); 
    if (length == 0) 
     return true; 

    for (int i = str.length() - length; i >= 0; i--) { 
     if (str.regionMatches(true, i, searchStr, 0, length)) 
      return true; 
    } 
    return false; 
} 
+1

Cảm ơn. Rất nhiều công cụ tốt đẹp khác trong đó, chẳng hạn như indexOfIgnoreCase ... – vikingsteve

+6

Phương pháp đó giả định rằng độ dài của phần được kết hợp của haystack sẽ là cùng số đơn vị mã UTF-16 như chiều dài của kim. Vì vậy, nếu bạn đang tìm kiếm "ß" và chuỗi chứa "SS", nó sẽ không tìm thấy kết quả phù hợp, mặc dù hai chuỗi này giống nhau nếu bạn bỏ qua trường hợp (bằng tiếng Đức, và tất nhiên bạn phải thiết lập miền địa phương bất cứ khi nào làm điều này.) – Trejkaz

+3

org.apache.commons.lang3.StringUtils gói này không có sẵn trong android –

21

Bạn có thể sử dụng java.util.regex.Pattern với cờ CASE_INSENSITIVE đối với trường hợp hợp nhạy cảm:

Pattern.compile(Pattern.quote(strptrn), Pattern.CASE_INSENSITIVE).matcher(str1).find(); 
+1

hãy xem câu trả lời trước @SamStephens đã viết http://stackoverflow.com/a/6996550/372926: bạn phải chỉ định cả CASE_INSENSITIVE và UNICODE_CASE và bạn vẫn sẽ không nhận được các giá trị phù hợp, bởi vì trong khi Java sử dụng toàn bộ casemapping, nó chỉ sử dụng casefolding đơn giản. Đây là một vấn đề." – Vini

206

Nếu bạn sẽ không đi với regex:

"ABCDEFGHIJKLMNOP".toLowerCase().contains("gHi".toLowerCase()) 
+2

Trong khi điều này có thể là một câu trả lời, tôi không nghĩ rằng đó là một giải pháp tốt trên lớn' String's –

+17

Điều này không làm việc trong thế giới rộng của unicode - xem http://stackoverflow.com/a/6996550/ 372.926 – SamStephens

+1

Giống như 'nếu (file.getName(). toLowerCase() \t \t \t \t \t \t Chứa (editText.getText(). toString(). toLowerCase()))' –

7

Hãy thử điều này

public static void main(String[] args) 
{ 

    String original = "ABCDEFGHIJKLMNOPQ"; 
    String tobeChecked = "GHi"; 

    System.out.println(containsString(original, tobeChecked, true));   
    System.out.println(containsString(original, tobeChecked, false)); 

} 

public static boolean containsString(String original, String tobeChecked, boolean caseSensitive) 
{ 
    if (caseSensitive) 
    { 
     return original.contains(tobeChecked); 

    } 
    else 
    { 
     return original.toLowerCase().contains(tobeChecked.toLowerCase()); 
    } 

} 
+1

Chuyển true thành tham số thứ ba nếu bạn muốn giá trị được kiểm tra trong trường hợp nhạy cảm và chuyển sai nếu bạn muốn giá trị cần kiểm tra trong trường hợp không nhạy cảm. –

1

Một tối ưu hóa phiên bản Imran Tariq của

Pattern.compile(strptrn, Pattern.CASE_INSENSITIVE + Pattern.LITERAL).matcher(str1).find(); 

Pattern.quote (strptrn) luôn trả về "\ Q" + s + "\ E" thậm chí nếu có là không có gì để báo giá, concatination chiến lợi phẩm.

+0

Bạn nên sử dụng bitwise | toán tử thay vì toán tử cộng. –

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