Como verificar se uma string começa com um dos vários prefixos?

101

Eu tenho a seguinte declaração if:

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

Quero incluir startsWith Mon Tues Weds Thurs Fridayetc. Existe uma maneira simples de fazer isso ao usar strings? Eu tentei, ||mas não funcionou.

FredBones
fonte
4
Quer dizer que você tentou "Mon||Tues"etc.? Ou você usou newStr4.startsWith("Mon")||newStr4.startsWith("Tues") ...? De qualquer forma, defina "não funcionou".
Thomas de
Você está tentando analisar uma data por acaso ?? Se sim, use SimpleDateFormat ...
Adam

Respostas:

176

Você quer dizer isso:

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

Ou você pode usar uma expressão regular:

if (newStr4.matches("(Mon|Tues|Wed|Thurs|Fri).*"))
hmjd
fonte
2
Existe alguma diferença de desempenho nos dois métodos que você sugeriu?
TheCrazyProgrammer
6
@TheCrazyProgrammer Claro que existe; a correspondência por meio de expressões regulares é muito mais cara do que chamadas de método de string bruta. Não posso dar números exatos, mas este é o consenso geral.
klaar
52

Além das soluções já apresentadas, você pode usar a biblioteca Apache Commons Lang:

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

Atualização: a introdução de varargs em algum ponto torna a chamada mais simples agora:

StringUtils.startsWithAny(newStr4, "Mon", "Tues",...)
Thomas
fonte
31

Ninguém foi mencionado Streamaté agora, então aqui está:

if (Stream.of("Mon", "Tues", "Wed", "Thurs", "Fri").anyMatch(s -> newStr4.startsWith(s)))
dejvuth
fonte
6
ótima (e atualizada) resposta ... a propósito, s -> newStr4.startsWith(s)pode ser substituída por newStr7::startsWithto be clear
Jordi Castilla
Como posso ignorar oCase aqui?
happybuddha
Você pode usar a função String toLowerCase ().
Ilia Kopysov
7

Uma solução simples é:

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

Uma solução mais sofisticada seria:

List<String> days = Arrays.asList("SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT");
String day = newStr4.substring(0, 3).toUpperCase();
if (days.contains(day)) {
    // ...
}
Óscar López
fonte
3
Ou Arrays.binarySearch () se a lista de pesquisa estiver classificada: D
Brendan Long
2
@BrendanLong um pouco exagerado para uma lista tão curta, mas ok :)
Óscar López
3

Claro, esteja ciente de que seu programa só será útil em países de língua inglesa se você detectar datas dessa forma. Você pode querer considerar:

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

A partir daí, você pode usar .startsWith ou .matches ou qualquer outro método que outros mencionaram acima. Desta forma, você obtém o local padrão para o jvm. Você sempre pode passar a localidade (e talvez padronizá-la para a localidade do sistema se for nula) também para ser mais robusto.

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

Você precisa incluir o todo str.startsWith(otherStr)para cada item, uma vez que|| só funciona com expressões booleanas (verdadeiro ou falso).

Existem outras opções se você tiver muitas coisas para verificar, como expressões regulares , mas elas tendem a ser mais lentas e expressões regulares mais complicadas são geralmente mais difíceis de ler.

Um exemplo de expressão regular para detectar abreviações de nomes de dias seria:

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

Quando você diz que tentou usar OU, como exatamente tentou usá-lo? No seu caso, o que você precisa fazer é algo assim:

String newStr4 = strr.split("2012")[0];
if(newStr4.startsWith("Mon") || newStr4.startsWith("Tues")...)
str4.add(newStr4);
npinti
fonte