¿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ó.


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).*"))

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",...)

31

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

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

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)) {
    // ...
}

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.


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)) {

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);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.