2012-03-20 7 views
77

Ive got poniższej instrukcji if:Jak sprawdzić, czy ciąg rozpoczyna się od jednego z kilku prefiksów?

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

Chcę, żeby to startswith 'mon' 'wt' '' 'poślubia thrus' 'Friday' itd Czy istnieje prosty sposób to podczas korzystania z ciągów? Próbowałem "||" ale to nie zadziałało ...

Dzięki!

+4

To znaczy, że próbował ' "Mon || wt"' itp? A może użyłeś 'newStr4.startsWith (" Mon ") || newStr4.startsWith (" Tues ") ...'? Tak czy inaczej, proszę zdefiniuj "to nie zadziałało". – Thomas

+0

Czy próbujesz przeanalizować datę przez przypadek? Jeśli tak, użyj SimpleDateFormat ... – Adam

Odpowiedz

132

Czy chodziło Ci o:

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

lub można użyć wyrażenia regularnego:

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

Czy są jakieś różnice w wydajności w dwóch metodach, które zasugerowałeś? – TheCrazyProgrammer

+3

@ TheCrazyProgrammer Oczywiście istnieje; Dopasowywanie za pomocą wyrażeń regularnych jest znacznie droższe niż wywołania metod ciągowych. Dokładne dane, których nie mogę podać, ale taki jest ogólny konsensus. – klaar

7

Prostym rozwiązaniem jest:

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

hodowcy rozwiązaniem byłoby:

List<String> days = Arrays.asList("SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"); 
String day = newStr4.substring(0, 3).toUpperCase(); 
if (days.contains(day)) { 
    // ... 
} 
+3

Lub [Arrays.binarySearch()] (http://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html#binarySearch%28java.lang.Object [],% 20java.lang.Obiekt% 29), jeśli lista wyszukiwania jest posortowana: D –

+1

@BrendanDługi nieco przesady dla tak krótkiej listy, ale ok :) –

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

Trzeba obejmują cały str.startsWith(otherStr) dla każdego elementu, ponieważ || działa tylko z wyrażeń logicznych (prawda czy fałsz).

Dostępne są inne opcje, jeśli masz wiele rzeczy do sprawdzenia, np. regular expressions, ale są one wolniejsze, a bardziej skomplikowane wyrażenia regularne są generalnie trudniejsze do odczytania.

Przykładem wyrażenie regularne do wykrywania skróty nazw dni będzie:

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

Kiedy mówisz, że próbował użyć OR, jak dokładnie było spróbować go używać? W twoim przypadku, co trzeba zrobić, by być czymś tak:

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

Oprócz rozwiązania przedstawione już, możesz użyć biblioteki Apache Commons Lang:

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

Oczywiście należy pamiętać, że program będzie użyteczny tylko w krajach anglojęzycznych, jeśli wykryje się daty w ten sposób. Możesz rozważyć:

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

Stamtąd możesz użyć .startsWith lub .match lub jakiejkolwiek innej metody, którą inni wspomnieli powyżej. W ten sposób otrzymasz domyślne ustawienia narodowe dla jvm. Zawsze możesz przekazać ustawienia narodowe (i być może ustawić domyślne ustawienia systemu, jeśli są puste), a także być bardziej niezawodne.

14

Nikt nie wspomniał Stream tak daleko, więc tutaj jest:

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

świetna (i aktualna) odpowiedź ... btw 's -> newStr4.startsWith (s)' może być zastąpiona przez 'newStr7 :: startsWith', aby być jaśniejszym –

+0

Jak mogę tutaj zignorować? – happybuddha