Bir dizeden dizeden herhangi birini içerip içermediğini görmek için bir dizeyi nasıl test edebilirim?
Kullanmak yerine
if (string.contains(item1) || string.contains(item2) || string.contains(item3))
Bir dizeden dizeden herhangi birini içerip içermediğini görmek için bir dizeyi nasıl test edebilirim?
Kullanmak yerine
if (string.contains(item1) || string.contains(item2) || string.contains(item3))
Yanıtlar:
EDIT: İşte Java 8 Streaming API kullanarak bir güncelleme. Çok daha temiz. Yine de düzenli ifadelerle birleştirilebilir.
public static boolean stringContainsItemFromList(String inputStr, String[] items) {
return Arrays.stream(items).parallel().anyMatch(inputStr::contains);
}
Ayrıca, girdi türünü bir dizi yerine bir Liste olarak değiştirirsek, items.parallelStream().anyMatch(inputStr::contains)
.
.filter(inputStr::contains).findAny()
Eşleşen dizeyi döndürmek istiyorsanız da kullanabilirsiniz .
Orijinal biraz tarihli cevap:
İşte bir (ÇOK TEMEL) statik yöntem. Karşılaştırma dizelerinde büyük / küçük harfe duyarlı olduğunu unutmayın. Büyük / küçük harfe duyarsız hale getirmenin ilkel bir yolu , hem giriş hem de test dizelerini çağırmak toLowerCase()
ya da çağırmak olacaktır toUpperCase()
.
Bundan daha karmaşık bir şey yapmanız gerekiyorsa, Pattern ve Matcher sınıflarına bakmanızı ve bazı düzenli ifadelerin nasıl yapılacağını öğrenmenizi öneririm . Bunları anladıktan sonra, bu sınıfları veya String.matches()
yardımcı yöntemi kullanabilirsiniz.
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;
}
import org.apache.commons.lang.StringUtils;
kullanın:
StringUtils.indexOfAny(inputString, new String[]{item1, item2, item3})
Bulunan dizenin dizinini veya hiçbiri bulunmazsa -1 değerini döndürür.
String # match yöntemini şu şekilde kullanabilirsiniz :
System.out.printf("Matches - [%s]%n", string.matches("^.*?(item1|item2|item3).*$"));
En kolay yol muhtemelen diziyi bir java.util.ArrayList'e dönüştürmektir. Bir arrayliste girdikten sonra, içerme yöntemini kolayca kullanabilirsiniz.
public static boolean bagOfWords(String str)
{
String[] words = {"word1", "word2", "word3", "word4", "word5"};
return (Arrays.asList(words).contains(str));
}
string
herhangi birini içeren String
dizideki s, herhangi bir değilse String
dizinin s içerir string
.
.equals()
çok kafa karıştırıcı. Onların sorularını düzenlemeleri gerektiğini
Eğer kullanırsanız Java 8 veya üstünde, güvenebileceğiniz Akış API böyle bir şey yapmak için:
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);
}
String
Test etmek için büyük bir dizi diziniz olduğu varsayılarak aramayı paralel olarak başlatabileceğinizi varsayarsak parallel()
, kod şöyle olur:
return Arrays.stream(items).parallel().anyMatch(inputString::contains);
İşte bir çözüm:
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;
}
3.4 sürümünden beri Apache Common Lang 3 includeAny yöntemini uygular .
Daha mükemmel bir yaklaşım, enjeksiyonu metaClass ile birlikte kullanmak olacaktır :
Söylemek isterim:
String myInput="This string is FORBIDDEN"
myInput.containsAny(["FORBIDDEN","NOT_ALLOWED"]) //=>true
Ve yöntem şöyle olurdu:
myInput.metaClass.containsAny={List<String> notAllowedTerms->
notAllowedTerms?.inject(false,{found,term->found || delegate.contains(term)})
}
Eğer gerekiyorsa containsAny ileride dize değişkeni sonra yerine nesnenin sınıfına yöntemi ekleyin hazır bulunmak için:
String.metaClass.containsAny={notAllowedTerms->
notAllowedTerms?.inject(false,{found,term->found || delegate.contains(term)})
}
Bunu dene:
if (Arrays.asList(item1, item2, item3).stream().anyMatch(string::contains))
Tam kelimeler için seraching ediyorsanız, bunu büyük / küçük harfe duyarsız çalıştırabilirsiniz .
private boolean containsKeyword(String line, String[] keywords)
{
String[] inputWords = line.split(" ");
for (String inputWord : inputWords)
{
for (String keyword : keywords)
{
if (inputWord.equalsIgnoreCase(keyword))
{
return true;
}
}
}
return false;
}
Bunu da yapabiliriz:
if (string.matches("^.*?((?i)item1|item2|item3).*$"))
(?i): used for case insensitive
.*? & .*$: used for checking whether it is present anywhere in between the string.
Aşağıda, Dizelerin içinde aradığınız dizi olduğunu varsayarak çalışmanız gerekir :
Arrays.binarySearch(Strings,"mykeytosearch",mysearchComparator);
burada mykeytosearch, dizideki varlığını test etmek istediğiniz dizedir. mysearchComparator - dizeleri karşılaştırmak için kullanılacak bir karşılaştırıcıdır.
Arrays.binarySearch sayfasına bakın fazla bilgi .
if (Arrays.asList(array).contains(string))