Ho due String
s, str1
e str2
. Come posso verificare se str2
è contenuto all'interno di str1
, ignorando la custodia?In Java, come posso controllare se una stringa contiene una sottostringa (ignorando il caso)?
risposta
str1.toLowerCase().contains(str2.toLowerCase())
per qualche motivo sto diventando falso quando chiamo "2014-03-25T17: 55: 00" .contains ("T") –
Esiste la funzione che restituisce e la posizione dove è occured che contengono (str2)? – RadijatoR
@RadijatoR sì, si chiama indexOf, come 'int pos = str1.indexOf (str2)' o case insensitive come 'int pos = str1.toLowerCase(). IndexOf (str2.toLowerCase())' –
È possibile utilizzare il metodo 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())
}
quindi chiamare utilizzando:
if(contains(str1, str2)) {
System.out.println("Found " + str2 + " within " + str1 + ".");
}
Si noti che con la creazione di un proprio metodo, è possibile riutilizzarlo. Quindi, quando qualcuno sottolinea che è necessario utilizzare contains
anziché indexOf
, è necessario modificare solo una singola riga di codice.
Ricordarsi di aggiungere Javadoc al comportamento durante il passaggio di oggetti nulli. –
Soluzione Help :) – akash89
Vorrei usare una combinazione del metodo contiene e del metodo toUpper
che fanno parte della classe String. Un esempio è qui sotto:
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()));
Ciò restituirà:
SEARCH1 = true
Search2 = false
Non funziona. Alcuni strani caratteri internazionali vengono convertiti in più caratteri quando convertiti in maiuscole/minuscole. Ad esempio: '" ß ".toUpperCase(). Equals (" SS ")' – Simon
Questo dovrebbe essere. Ecco come una doppia s è scritta in tedesco. –
Come su 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.*");
L'esempio "indexOf" deve usare> = 0, non> 0, poiché 0 è valido se la sottostringa si verifica all'inizio della stringa. (Non nel tuo esempio, ma potrebbe in altri casi.) Aggiunta questa risposta poiché le persone ovviamente stanno ancora cercando e trovando questa risposta. –
Se siete in grado di utilizzare org.apache.commons.lang.StringUtils, io suggerisco di usare il seguente:
String container = "aBcDeFg";
String content = "dE";
boolean containerContainsContent = StringUtils.containsIgnoreCase(container, content);
Ho anche favorire la soluzione RegEx. Il codice sarà molto più pulito. Avrei esitato a usare aLowerCase() in situazioni in cui sapevo che le stringhe sarebbero state grandi, poiché le stringhe sono immutabili e dovrebbero essere copiate. Inoltre, la soluzione matches() potrebbe essere confusa perché richiede un'espressione regolare come argomento (la ricerca di "Need $ le" potrebbe essere problematica).
costruzione su alcuni degli esempi di cui sopra:
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 + ".");
}
(Nota:. Si potrebbe desiderare di gestire le stringhe NULL e vuoti in modo diverso a seconda delle esigenze penso che modo mi hanno è più vicino alle specifiche Java per le stringhe.)
Le soluzioni critiche della velocità potrebbero includere l'iterazione del carattere di pagliaio di carattere alla ricerca del primo carattere dell'ago. Quando il primo carattere è abbinato (caso in modo insensibile), inizia a scorrere l'ago carattere per carattere, cercando il carattere corrispondente nel pagliaio e restituendo "true" se tutti i caratteri vengono abbinati. Se si incontra un personaggio non abbinato, riprendi l'iterazione attraverso il pagliaio al carattere successivo, restituendo "falso" se viene raggiunta una posizione> haystack.length() - needle.length().
Vorrei fare: 'Pattern.CASE_INSENSITIVE | Pattern.LITERAL' –
@mikejones Come posso controllare questo solo per le parole? Si consideri il caso sotto 1) "Questo è un pagliaio che potrebbe avere bisogno di $ le in esso."; 2) "Questo è un pagliaio che potrebbe avere bisogno di meno $ in esso."; Voglio che solo il caso 1 sia abbinato come in quel caso è necessario $ le è presente come parola. Non voglio che il secondo caso sia abbinato. Come posso ottenere questo? –
Sia indexOf che contiene carattere per carattere, quindi se è necessaria una ricerca stringa più veloce (che è possibile ottenere), è necessario implementare uno dei numerosi algoritmi pubblicati. –
Ho la stessa domanda qui è la risposta :) http: // StackOverflow.it/a/86832/621951 –