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.


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

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

31

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

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

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

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.


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

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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.