Wie überprüfe ich, ob eine Zeichenfolge mit einem von mehreren Präfixen beginnt?

101

Ich habe die folgende if-Anweisung:

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

Ich möchte, dass es startsWith Mon Tues Weds Thurs Fridayusw. enthält . Gibt es eine einfache Möglichkeit, dies bei der Verwendung von Zeichenfolgen zu tun? Ich habe es versucht, ||aber es hat nicht funktioniert.

FredBones
quelle
4
Du meinst, du hast es versucht "Mon||Tues"usw.? Oder hast du benutzt newStr4.startsWith("Mon")||newStr4.startsWith("Tues") ...? In beiden Fällen definieren Sie bitte "es hat nicht funktioniert".
Thomas
Versuchen Sie zufällig, ein Datum zu analysieren? Wenn ja, verwenden Sie SimpleDateFormat ...
Adam

Antworten:

176

Meinst du das:

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

Oder Sie könnten einen regulären Ausdruck verwenden:

if (newStr4.matches("(Mon|Tues|Wed|Thurs|Fri).*"))
hmjd
quelle
2
Gibt es Leistungsunterschiede zwischen den beiden von Ihnen vorgeschlagenen Methoden?
TheCrazyProgrammer
6
@ TheCrazyProgrammer Natürlich gibt es; Der Abgleich über reguläre Ausdrücke ist viel teurer als der Aufruf von Raw-String-Methoden. Genaue Zahlen kann ich nicht angeben, aber dies ist der allgemeine Konsens.
Klaar
52

Neben den bereits vorgestellten Lösungen können Sie auch die Apache Commons Lang-Bibliothek verwenden:

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

Update: Die Einführung von varargs macht den Aufruf jetzt einfacher:

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

Bisher wurde niemand erwähnt Stream, also hier ist es:

if (Stream.of("Mon", "Tues", "Wed", "Thurs", "Fri").anyMatch(s -> newStr4.startsWith(s)))
Dejvuth
quelle
6
tolle (und aktuelle) Antwort ... übrigens s -> newStr4.startsWith(s)kann ersetzt werden newStr7::startsWith, um klarer zu sein
Jordi Castilla
Wie kann ich Case hier ignorieren?
Happybuddha
Sie können die Funktion String toLowerCase () verwenden.
Ilia Kopysov
7

Eine einfache Lösung ist:

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

Eine schickere Lösung wäre:

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
quelle
3
Oder Arrays.binarySearch (), wenn die Suchliste sortiert ist: D
Brendan Long
2
@BrendanLong ein bisschen übertrieben für eine so kurze Liste, aber ok :)
Óscar López
3

Beachten Sie natürlich, dass Ihr Programm nur in englischsprachigen Ländern nützlich ist, wenn Sie Daten auf diese Weise ermitteln. Vielleicht möchten Sie Folgendes berücksichtigen:

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

Von dort aus können Sie .startsWith oder .matches oder eine andere Methode verwenden, die andere oben erwähnt haben. Auf diese Weise erhalten Sie das Standardgebietsschema für das JVM. Sie können das Gebietsschema jederzeit übergeben (und es möglicherweise standardmäßig an das Systemgebietsschema übergeben, wenn es null ist), um auch robuster zu sein.

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

Sie müssen das Ganze str.startsWith(otherStr)für jedes Element einschließen , da dies ||nur mit booleschen Ausdrücken (wahr oder falsch) funktioniert.

Es gibt andere Optionen, wenn Sie viele Dinge überprüfen müssen, wie z. B. reguläre Ausdrücke . Diese sind jedoch tendenziell langsamer und kompliziertere reguläre Ausdrücke sind im Allgemeinen schwerer zu lesen.

Ein Beispiel für einen regulären Ausdruck zum Erkennen von Abkürzungen für Tagesnamen wäre:

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

Wenn Sie sagen, Sie haben versucht, OR zu verwenden, wie genau haben Sie versucht, es zu verwenden? In Ihrem Fall müssten Sie ungefähr so ​​vorgehen:

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