2012-03-20 9 views
77

Ive consiguió la declaración siguiente si:¿Cómo comprobar si una cadena comienza con uno de varios prefijos?

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

quiero que incluye startsWith 'Mon' 'mar' 'casados' '', etc. Thrus 'Viernes' ¿Hay una manera simple de esto cuando el uso de cadenas? Intenté '||' pero no funcionó ...

¡Gracias!

+4

¿Quiere decir que ha intentado ' "Mon || mar"' etc.? ¿O usó 'newStr4.startsWith (" Mon ") || newStr4.startsWith (" Tues ") ...'? De cualquier manera, defina "no funcionó". – Thomas

+0

¿Estás tratando de analizar una fecha por casualidad? Si es así, use SimpleDateFormat ... – Adam

Respuesta

132

Qué quiere decir:

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

o puede utilizar expresiones regulares:

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

¿Hay alguna diferencia de rendimiento en los dos métodos que sugirió? – TheCrazyProgrammer

+3

@TheCrazyProgrammer Por supuesto que sí; la coincidencia a través de expresiones regulares es mucho más costosa que las llamadas a métodos de cadenas sin procesar. No puedo dar cifras exactas, pero este es el consenso general. – klaar

7

Una solución sencilla 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()] (http://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html#binarySearch%28java.lang.Object [],% 20java.lang.Objeto% 29) si la lista de búsqueda está ordenada: D –

+1

@BrendanLong es un poco exagerado para una lista tan breve, pero está bien :) –

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

Es necesario incluir toda la str.startsWith(otherStr) para cada elemento, ya que || sólo funciona con expresiones booleanas (verdadero o falso).

Hay otras opciones para comprobar, como regular expressions, pero tienden a ser más lentas y las expresiones regulares más complicadas suelen ser más difíciles de leer.

Un ejemplo de expresiones regulares para detectar abreviaturas de nombres de días sería:

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

Cuando dice que ha intentado usar O, ¿cómo es exactamente lo que lo prueba y utiliza? En su caso, lo que tendrá que hacer sería algo así:

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

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

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

Por supuesto, tenga en cuenta que su programa solo será útil en países de habla inglesa si detecta las 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í se puede utilizar .startsWith o .matches o cualquier otro método que otros han mencionado anteriormente. De esta forma, obtienes la configuración regional predeterminada para jvm. Siempre puede pasar la configuración regional (y tal vez la configuración predeterminada del sistema si es nula) para ser más robusto.

14

Nadie mencionado Stream hasta el momento, así que aquí está:

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

excelente (y actualizada) respuesta ... btw 's -> newStr4.startsWith (s)' puede ser reemplazada por 'newStr7 :: startsWith' para ser más clara –

+0

¿Cómo puedo ignorar el caso aquí? – happybuddha

Cuestiones relacionadas