¿Cómo comprobar si una cadena comienza con uno de varios prefijos?

101

Tengo la siguiente declaración if:

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

Quiero que incluya, startsWith Mon Tues Weds Thurs Fridayetc. ¿Existe una forma sencilla de hacerlo cuando se utilizan cadenas? Lo intenté ||pero no funcionó.

FredBones
fuente
4
¿Quieres decir que lo intentaste, "Mon||Tues"etc.? ¿O usaste newStr4.startsWith("Mon")||newStr4.startsWith("Tues") ...? De cualquier manera, defina "no funcionó".
Thomas
¿Estás intentando analizar una fecha por casualidad? Si es así, use SimpleDateFormat ...
Adam

Respuestas:

176

Quieres decir esto:

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

O podría usar una expresión regular:

if (newStr4.matches("(Mon|Tues|Wed|Thurs|Fri).*"))
hmjd
fuente
2
¿Existe alguna diferencia de rendimiento en los dos métodos que sugirió?
TheCrazyProgrammer
6
@TheCrazyProgrammer Por supuesto que hay; la coincidencia mediante expresiones regulares es mucho más cara que las llamadas al método de cadena sin formato. No puedo dar cifras exactas, pero este es el consenso general.
klaar
52

Además de las soluciones presentadas ya, puede usar la biblioteca Apache Commons Lang:

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

Actualización: la introducción de varargs en algún momento hace que la llamada sea más sencilla ahora:

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

Nadie ha mencionado Streamhasta ahora, así que aquí está:

if (Stream.of("Mon", "Tues", "Wed", "Thurs", "Fri").anyMatch(s -> newStr4.startsWith(s)))
dejvuth
fuente
6
excelente (y actualizada) respuesta ... por cierto s -> newStr4.startsWith(s)se puede reemplazar por newStr7::startsWithpara ser más claro
Jordi Castilla
¿Cómo puedo ignorar el caso aquí?
happybuddha
Puede utilizar la función String toLowerCase ().
Ilia Kopysov
7

Una solución simple es:

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

Una solución más elegante sería:

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
fuente
3
O Arrays.binarySearch () si la lista de búsqueda está ordenada: D
Brendan Long
2
@BrendanLong un poco exagerado para una lista tan corta, pero está bien :)
Óscar López
3

Por supuesto, tenga en cuenta que su programa solo será útil en países de habla inglesa si detecta fechas de esta manera. Es posible que desee considerar:

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

Desde allí, puede usar .startsWith o .matches o cualquier otro método que otros hayan mencionado anteriormente. De esta forma obtendrá la configuración regional predeterminada para jvm. Siempre puede pasar la configuración regional (y tal vez por defecto a la configuración regional del sistema si es nula) también para ser más robusto.

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

Debe incluir el todo str.startsWith(otherStr)para cada elemento, ya que ||solo funciona con expresiones booleanas (verdadero o falso).

Hay otras opciones si tiene muchas cosas que verificar, como las expresiones regulares , pero tienden a ser más lentas y las expresiones regulares más complicadas son generalmente más difíciles de leer.

Un ejemplo de expresión regular para detectar abreviaturas de nombres de días sería:

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

Cuando dice que intentó usar OR, ¿cómo lo intentó exactamente? En su caso, lo que deberá hacer sería algo así:

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