Come verificare se una stringa inizia con uno dei diversi prefissi?


101

Ho la seguente dichiarazione if:

String newStr4 = strr.split("2012")[0];
if (newStr4.startsWith("Mon")) {
    str4.add(newStr4);
}

Voglio che includa startsWith Mon Tues Weds Thurs Fridayecc. C'è un modo semplice per farlo quando si usano le stringhe? Ho provato ||ma non ha funzionato.


4
Vuoi dire che hai provato "Mon||Tues"ecc.? O hai usato newStr4.startsWith("Mon")||newStr4.startsWith("Tues") ...? Ad ogni modo, definisci "non ha funzionato".
Thomas

Stai cercando di analizzare una data per caso ?? In tal caso, utilizzare SimpleDateFormat ...
Adam

Risposte:


176

Intendi questo:

if (newStr4.startsWith("Mon") || newStr4.startsWith("Tues") || ...)

Oppure potresti usare l'espressione regolare:

if (newStr4.matches("(Mon|Tues|Wed|Thurs|Fri).*"))

2
C'è qualche differenza di prestazioni nei due metodi che hai suggerito?
TheCrazyProgrammer

6
@TheCrazyProgrammer Ovviamente c'è; la corrispondenza tramite espressioni regolari è molto più costosa delle chiamate a metodi di stringa non elaborata. Cifre esatte non posso fornire, ma questo è il consenso generale.
klaar

52

Oltre alle soluzioni già presentate, potresti utilizzare la libreria Apache Commons Lang:

if(StringUtils.startsWithAny(newStr4, new String[] {"Mon","Tues",...})) {
  //whatever
}

Aggiornamento: l'introduzione di vararg a un certo punto rende la chiamata più semplice ora:

StringUtils.startsWithAny(newStr4, "Mon", "Tues",...)

31

Nessuno ha menzionato Streamfinora, quindi eccolo qui:

if (Stream.of("Mon", "Tues", "Wed", "Thurs", "Fri").anyMatch(s -> newStr4.startsWith(s)))

6
ottima (e aggiornata) risposta ... btw s -> newStr4.startsWith(s)può essere sostituita da newStr7::startsWithper essere più chiari
Jordi Castilla

Come posso ignorare il caso qui?
happybuddha

È possibile utilizzare la funzione String toLowerCase ().
Ilia Kopysov

7

Una semplice soluzione è:

if (newStr4.startsWith("Mon") || newStr4.startsWith("Tue") || newStr4.startsWith("Wed"))
// ... you get the idea ...

Una soluzione più elaborata sarebbe:

List<String> days = Arrays.asList("SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT");
String day = newStr4.substring(0, 3).toUpperCase();
if (days.contains(day)) {
    // ...
}

3
Oppure Arrays.binarySearch () se l'elenco di ricerca è ordinato: D
Brendan Long,

2
@BrendanLong un po 'eccessivo per un elenco così breve, ma ok :)
Óscar López

3

Naturalmente, tieni presente che il tuo programma sarà utile nei paesi di lingua inglese solo se rilevi le date in questo modo. Potresti prendere in considerazione:

Set<String> dayNames = Calendar.getInstance()
 .getDisplayNames(Calendar.DAY_OF_WEEK,
      Calendar.SHORT,
      Locale.getDefault())
 .keySet();

Da lì puoi usare .startsWith o .matches o qualsiasi altro metodo che altri hanno menzionato sopra. In questo modo ottieni la localizzazione predefinita per jvm. Puoi sempre passare la locale (e magari impostarla di default sulla locale del sistema se è nulla) anche per essere più affidabile.


1
if(newStr4.startsWith("Mon") || newStr4.startsWith("Tues") || newStr4.startsWith("Weds") .. etc)

È necessario includere l'intero str.startsWith(otherStr)per ogni elemento, da allora|| funziona solo con espressioni booleane (vero o falso).

Ci sono altre opzioni se hai molte cose da controllare, come le espressioni regolari , ma tendono ad essere più lente e le espressioni regolari più complicate sono generalmente più difficili da leggere.

Un esempio di espressione regolare per rilevare le abbreviazioni dei nomi dei giorni potrebbe essere:

if(Pattern.matches("Mon|Tues|Wed|Thurs|Fri", stringToCheck)) {

0

Quando dici che hai provato a usare OR, esattamente come hai provato a usarlo? Nel tuo caso, ciò che dovrai fare sarebbe qualcosa del genere:

String newStr4 = strr.split("2012")[0];
if(newStr4.startsWith("Mon") || newStr4.startsWith("Tues")...)
str4.add(newStr4);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.