2012-01-24 38 views
84

Làm cách nào để kiểm tra chuỗi để xem chuỗi có chứa bất kỳ chuỗi nào từ một mảng không?Kiểm tra xem chuỗi có chứa bất kỳ chuỗi nào trong một mảng

Thay vì sử dụng

if (string.contains(item1) || string.contains(item2) || string.contains(item3)) 
+4

Bạn có yêu cầu nếu một chuỗi là ** ** bình đẳng với bất kỳ chuỗi trong mảng, hoặc ** chứa ** bất kỳ chuỗi nào trong mảng? – Natix

+1

Bạn muốn kiểm tra xem chuỗi nào từ mảng có phải là chuỗi con của chuỗi đầu vào không? Hoặc bạn muốn kiểm tra xem chuỗi đầu vào của bạn có bằng * một trong chuỗi trong mảng không? Bạn có thể chính xác hơn không? –

+1

chứa, do đó, nó phải mất một dòng và xem nếu nó có chứa bất kỳ từ nào từ một danh sách (được lưu trữ như một mảng của chuỗi) – user1060828

Trả lời

93

EDIT: Đây là bản cập nhật sử dụng API Java 8 Streaming. Sạch hơn nhiều. Vẫn có thể được kết hợp với các cụm từ thông dụng.

public static boolean stringContainsItemFromList(String inputStr, String[] items) { 
    return Arrays.stream(items).parallel().anyMatch(inputStr::contains); 
} 

Ngoài ra, nếu chúng tôi thay đổi loại đầu vào thành Danh sách thay vì mảng, chúng tôi có thể sử dụng items.parallelStream().anyMatch(inputStr::contains).

Bạn cũng có thể sử dụng .filter(inputStr::contains).findAny() nếu bạn muốn trả lại chuỗi phù hợp.


Original câu trả lời hơi ngày:

Đây là một (RẤT BASIC) phương pháp tĩnh. Lưu ý rằng đó là trường hợp nhạy cảm trên các chuỗi so sánh. A nguyên thủy cách làm cho trường hợp không phân biệt chữ hoa chữ thường là gọi toLowerCase() hoặc toUpperCase() trên cả chuỗi đầu vào và chuỗi thử nghiệm.

Nếu bạn cần làm bất cứ điều gì phức tạp hơn điều này, tôi khuyên bạn nên xem các lớp học PatternMatcher và tìm hiểu cách thực hiện một số cụm từ thông dụng. Khi bạn hiểu những điều đó, bạn có thể sử dụng các lớp đó hoặc phương pháp trợ giúp String.matches().

public static boolean stringContainsItemFromList(String inputStr, String[] items) 
{ 
    for(int i =0; i < items.length; i++) 
    { 
     if(inputStr.contains(items[i])) 
     { 
      return true; 
     } 
    } 
    return false; 
} 
17

Cách đơn giản nhất có lẽ sẽ là để chuyển đổi mảng thành một java.util.ArrayList. Khi nó nằm trong danh sách, bạn có thể dễ dàng tận dụng phương thức chứa.

public static boolean bagOfWords(String str) 
{ 
    String[] words = {"word1", "word2", "word3", "word4", "word5"}; 
    return (Arrays.asList(words).contains(str)); 
} 
+47

Điều này là không chính xác. OP sẽ hỏi liệu 'string' có chứa bất kỳ' String 'nào trong mảng không, nếu không có' String 'trong mảng chứa' chuỗi'. –

+3

@ BeauGrantham Tôi cũng đang nghĩ về điều này, nhưng OP đang sử dụng '.equals()' trong bài đăng của họ, điều này rất khó hiểu. Tôi nghĩ rằng họ cần phải chỉnh sửa câu hỏi của họ – gnomed

+0

@BeauGrantham Man Tôi không thể thề rằng tôi đã hiểu được vấn đề. Có lẽ câu hỏi cần được làm rõ hơn một chút? –

7

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

if (Arrays.asList(item1, item2, item3).contains(string)) 
+9

Câu hỏi ngược lại: Chuỗi mục tiêu có chứa bất kỳ chuỗi nào của danh sách hay không. –

+0

Câu hỏi là đối diện – sgrillon

1
if (Arrays.asList(array).contains(string)) 
+8

Câu hỏi ngược lại: Chuỗi mục tiêu có chứa bất kỳ chuỗi nào của danh sách hay không. –

+2

Câu hỏi là đối diện – sgrillon

27

Bạn có thể sử dụng String#matches phương pháp như thế này:

System.out.printf("Matches - [%s]%n", string.matches("^.*?(item1|item2|item3).*$")); 
-2

dưới đây nên làm việc cho bạn giả Strings là mảng mà bạn đang tìm kiếm trong:

Arrays.binarySearch(Strings,"mykeytosearch",mysearchComparator); 

nơi mykeytosearch là chuỗi mà bạn muốn kiểm tra sự tồn tại trong mảng. mysearchComparator - là một bộ so sánh sẽ được sử dụng để so sánh các chuỗi.

Tham khảo Arrays.binarySearch để biết thêm thông tin.

+2

Cần lưu ý rằng binarySearch chỉ hoạt động trên mảng được sắp xếp, hoặc là tự nhiên hoặc theo trình so sánh đã cho (nếu được đưa ra). – Natix

0

Một cách tiếp cận groovyesque hơn sẽ được sử dụng tiêm kết hợp với metaclass:

tôi sẽ để thích nói:

String myInput="This string is FORBIDDEN" 
myInput.containsAny(["FORBIDDEN","NOT_ALLOWED"]) //=>true 

Và phương pháp này sẽ là:

myInput.metaClass.containsAny={List<String> notAllowedTerms-> 
    notAllowedTerms?.inject(false,{found,term->found || delegate.contains(term)}) 
} 

Nếu bạn cần containsAny có mặt cho bất kỳ biến String tương lai sau đó thêm phương pháp này đến lớp thay vì đối tượng:

String.metaClass.containsAny={notAllowedTerms-> 
    notAllowedTerms?.inject(false,{found,term->found || delegate.contains(term)}) 
} 
40
import org.apache.commons.lang.StringUtils; 

String Utils

Sử dụng:

StringUtils.indexOfAny(inputString, new String[]{item1, item2, item3}) 

Nó sẽ trả về chỉ mục của chuỗi được tìm thấy hoặc -1 nếu không tìm thấy.

+4

JFI: Tôi hy vọng điều này thực hiện để lặp lại chỉ một lần trên inputString, nhưng tôi đã xem mã trong StringUtils, và thật đáng buồn nó chỉ thực hiện N cuộc gọi của defaultOf mặc định. – alfonx

+0

Có thể trên commons3 việc triển khai tốt hơn! – renanlf

+0

Không, vẫn chỉ lặp qua các Chuỗi trong org.apache.commons.lang3.StringUtils: cho (int i = 0; i alfonx

2

Dưới đây là một giải pháp:

public static boolean containsAny(String str, String[] words) 
{ 
    boolean bResult=false; // will be set, if any of the words are found 
    //String[] words = {"word1", "word2", "word3", "word4", "word5"}; 

    List<String> list = Arrays.asList(words); 
    for (String word: list) { 
     boolean bFound = str.contains(word); 
     if (bFound) {bResult=bFound; break;} 
    } 
    return bResult; 
} 
-1
String.prototype.matchWithTokens = function(tokensArray){ 
    for(i=0; i< tokensArray.length; i++) { 
    if(this.indexOf(tokensArray[i]) != -1) { 
     return true; 
    } 
    } 
    return false; 
}; 
+0

Đây không phải là mã Java. – Hamdi

7

Nếu bạn sử dụng Java 8 trở lên, bạn có thể dựa vào các Stream API để làm điều như vậy:

public static boolean containsItemFromArray(String inputString, String[] items) { 
    // Convert the array of String items as a Stream 
    // For each element of the Stream call inputString.contains(element) 
    // If you have any match returns true, false otherwise 
    return Arrays.stream(items).anyMatch(inputString::contains); 
} 

Giả sử bạn có một mảng lớn của String để kiểm tra bạn cũng có thể song song tìm kiếm bằng cách gọi parallel(), sau đó mã sẽ là:

return Arrays.stream(items).parallel().anyMatch(inputString::contains); 
+0

Một điều kỳ lạ tôi nhận thấy, tôi có hai mục trong danh sách Chuỗi, tôi phát hiện ra, khi tôi sử dụng 'song song' nó sẽ không trả lại kết quả chính xác. (ngay cả khi nó chứa giá trị). –

+0

@ Charles.C thật kỳ lạ tôi không thể tái tạo bên cạnh tôi. –

0

Và nếu bạn đang tìm kiếm trường hợp trận đấu nhạy cảm, sử dụng mô hình

Pattern pattern = Pattern.compile("\\bitem1 |item2\\b",java.util.regex.Pattern.CASE_INSENSITIVE); 

    Matcher matcher = pattern.matcher(input); 
    if(matcher.find()){ 

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