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