2010-02-16 26 views
432

Tôi có hai String s, str1str2. Làm cách nào để kiểm tra xem str2 có nằm trong phạm vi str1, bỏ qua trường hợp không?Trong Java, làm cách nào để kiểm tra xem chuỗi có chứa chuỗi con (bỏ qua trường hợp) không?

+1

Cả hai chỉ mụcOf và chứa ký tự đi theo ký tự, vì vậy nếu bạn cần tìm kiếm chuỗi nhanh hơn (bạn có thể nhận được), thì bạn sẽ cần triển khai một trong nhiều thuật toán đã xuất bản. –

+2

Tôi có cùng một câu hỏi ở đây là câu trả lời :) http: // stackoverflow.com/a/86832/621951 –

Trả lời

878
str1.toLowerCase().contains(str2.toLowerCase()) 
+4

vì lý do nào đó tôi bị sai khi tôi gọi "2014-03-25T17: 55: 00" .contains ("T") –

+3

Có chức năng trả về và vị trí xuất hiện chứa (str2))? – RadijatoR

+6

@RadijatoR có, nó được gọi là indexOf, như 'int pos = str1.indexOf (str2)' hoặc phân biệt dạng chữ như 'int pos = str1.toLowerCase(). IndexOf (str2.toLowerCase())' –

20

Bạn có thể sử dụng phương pháp toLowerCase():

public boolean contains(String haystack, String needle) { 
    haystack = haystack == null ? "" : haystack; 
    needle = needle == null ? "" : needle; 

    // Works, but is not the best. 
    //return haystack.toLowerCase().indexOf(needle.toLowerCase()) > -1 

    return haystack.toLowerCase().contains(needle.toLowerCase()) 
} 

Sau đó gọi nó là sử dụng:

if(contains(str1, str2)) { 
    System.out.println("Found " + str2 + " within " + str1 + "."); 
} 

ý rằng bằng cách tạo ra phương pháp riêng của mình, bạn có thể tái sử dụng nó. Sau đó, khi ai đó chỉ ra rằng bạn nên sử dụng contains thay vì indexOf, bạn chỉ có một dòng mã để thay đổi.

+5

Hãy nhớ thêm Javadoc về hành vi khi truyền các đối tượng null. –

+0

Giải pháp Giúp :) – akash89

6

Tôi muốn sử dụng kết hợp phương pháp chứa và phương thức toUpper là một phần của lớp Chuỗi. Một ví dụ là dưới đây:

String string1 = "AAABBBCCC"; 
String string2 = "DDDEEEFFF"; 
String searchForThis = "AABB"; 

System.out.println("Search1="+string1.toUpperCase().contains(searchForThis.toUpperCase())); 

System.out.println("Search2="+string2.toUpperCase().contains(searchForThis.toUpperCase())); 

này sẽ trở lại:

Search1 = true
Search2 = false

+4

Sẽ không hoạt động. Một số ký tự lạ, quốc tế được chuyển đổi thành nhiều ký tự khi được chuyển đổi thành chữ thường/chữ hoa. Ví dụ: '" ß ".toUpperCase(). Bằng (" SS ")' – Simon

+1

Điều đó sẽ hình thành. Đó là cách một đôi s được viết bằng tiếng Đức. –

111

Làm thế nào về matches()?

String string = "Madam, I am Adam"; 

// Starts with 
boolean b = string.startsWith("Mad"); // true 

// Ends with 
b = string.endsWith("dam");    // true 

// Anywhere 
b = string.indexOf("I am") >= 0;  // true 

// To ignore case, regular expressions must be used 

// Starts with 
b = string.matches("(?i)mad.*"); 

// Ends with 
b = string.matches("(?i).*adam"); 

// Anywhere 
b = string.matches("(?i).*i am.*"); 
+12

Ví dụ "indexOf" của bạn nên sử dụng> = 0, không> 0, vì 0 là hợp lệ nếu chuỗi con xuất hiện ở đầu chuỗi. (Không có trong ví dụ của bạn, nhưng có thể trong các trường hợp khác.) Đã thêm phản hồi này vì mọi người rõ ràng vẫn đang tìm kiếm và tìm câu trả lời này. –

29

Nếu bạn có thể sử dụng org.apache.commons.lang.StringUtils, tôi đề nghị sử dụng như sau:

String container = "aBcDeFg"; 
String content = "dE"; 
boolean containerContainsContent = StringUtils.containsIgnoreCase(container, content); 
9

Tôi cũng ủng hộ giải pháp RegEx. Mã sẽ sạch hơn nhiều. Tôi sẽ ngần ngại sử dụng toLowerCase() trong các tình huống mà tôi biết các chuỗi sẽ lớn, vì các chuỗi không thay đổi và sẽ phải được sao chép. Ngoài ra, các giải pháp match() có thể gây nhầm lẫn bởi vì nó có một biểu thức chính quy như là một đối số (tìm kiếm "Cần $ le" lạnh có vấn đề).

xây dựng trên một số các ví dụ trên:

public boolean containsIgnoreCase(String haystack, String needle) { 
    if(needle.equals("")) 
    return true; 
    if(haystack == null || needle == null || haystack .equals("")) 
    return false; 

    Pattern p = Pattern.compile(needle,Pattern.CASE_INSENSITIVE+Pattern.LITERAL); 
    Matcher m = p.matcher(haystack); 
    return m.find(); 
} 

example call: 

String needle = "Need$le"; 
String haystack = "This is a haystack that might have a need$le in it."; 
if(containsIgnoreCase(haystack, needle)) { 
    System.out.println("Found " + needle + " within " + haystack + "."); 
} 

(Lưu ý:. Bạn có thể muốn để xử lý chuỗi NULL và trống rỗng khác nhau tùy thuộc vào nhu cầu của bạn tôi nghĩ rằng họ cách tôi có nó là gần gũi hơn với spec Java cho dây.)

Các giải pháp quan trọng tốc độ có thể bao gồm lặp qua ký tự haystack bằng ký tự tìm kiếm ký tự đầu tiên của kim. Khi ký tự đầu tiên được khớp (trường hợp không liên tục), bắt đầu lặp lại thông qua ký tự kim theo ký tự, tìm kiếm ký tự tương ứng trong haystack và trả về "true" nếu tất cả các ký tự được khớp. Nếu gặp phải một ký tự không khớp, hãy tiếp tục lặp lại thông qua haystack ở ký tự tiếp theo, trả về "false" nếu đạt được vị trí> haystack.length() - needle.length().

+2

Tôi sẽ làm: 'Pattern.CASE_INSENSITIVE | Pattern.LITERAL' –

+0

@mikejones Làm cách nào tôi có thể kiểm tra điều này chỉ cho các từ? Hãy xem xét trường hợp dưới đây 1) "Đây là một đống cỏ khô có thể có nhu cầu $ le trong đó."; 2) "Đây là một đống cỏ khô có thể có nhu cầu $ lesss trong đó."; Tôi chỉ muốn trường hợp 1 được so khớp như trong trường hợp đó cần $ le là một từ. Tôi không muốn trường hợp thứ 2 được khớp. Tôi làm cách nào để đạt được điều này? –

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