Bagaimana cara memeriksa apakah sebuah string dimulai dengan salah satu dari beberapa prefiks?

101

Saya memiliki pernyataan if berikut:

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

Saya ingin menyertakannya, startsWith Mon Tues Weds Thurs Fridaydll. Apakah ada cara sederhana untuk melakukannya saat menggunakan string? Saya mencoba ||tetapi tidak berhasil.

FredBones
sumber
4
Maksudmu kamu mencoba "Mon||Tues"dll.? Atau apakah Anda menggunakan newStr4.startsWith("Mon")||newStr4.startsWith("Tues") ...? Apa pun pilihannya, harap jelaskan "tidak berhasil".
Thomas
Apakah Anda kebetulan mencoba mengurai tanggal ?? Jika demikian gunakan SimpleDateFormat ...
Adam

Jawaban:

176

Maksudmu ini:

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

Atau Anda bisa menggunakan ekspresi reguler:

if (newStr4.matches("(Mon|Tues|Wed|Thurs|Fri).*"))
hmjd
sumber
2
Apakah ada perbedaan performa dalam kedua metode yang Anda sarankan?
TheCrazyProgrammer
6
@TheCrazyProgrammer Tentu saja ada; pencocokan melalui ekspresi reguler jauh lebih mahal daripada panggilan metode string mentah. Angka pasti tidak bisa saya berikan, tetapi ini adalah kesepakatan umum.
klaar
52

Selain solusi yang sudah disajikan, Anda dapat menggunakan pustaka Apache Commons Lang:

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

Pembaruan: pengenalan vararg di beberapa titik membuat panggilan lebih sederhana sekarang:

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

StreamSejauh ini belum ada yang disebutkan , jadi ini dia:

if (Stream.of("Mon", "Tues", "Wed", "Thurs", "Fri").anyMatch(s -> newStr4.startsWith(s)))
dejvuth.dll
sumber
6
jawaban yang bagus (dan terkini) ... btw s -> newStr4.startsWith(s)dapat diganti dengan newStr7::startsWithuntuk menjadi lebih jelas
Jordi Castilla
Bagaimana saya bisa ignoreCase di sini?
happybuddha
Anda dapat menggunakan fungsi String toLowerCase ().
Ilia Kopysov
7

Solusi sederhana adalah:

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

Solusi yang lebih menarik adalah:

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
sumber
3
Atau Arrays.binarySearch () jika daftar pencarian mereka diurutkan: D
Brendan Long
2
@BrendanLong sedikit berlebihan untuk daftar pendek seperti itu, tapi oke :)
Óscar López
3

Tentu saja, perhatikan bahwa program Anda hanya akan berguna di negara-negara berbahasa Inggris jika Anda mendeteksi tanggal dengan cara ini. Anda mungkin ingin mempertimbangkan:

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

Dari sana Anda dapat menggunakan .startsWith atau .matches atau metode lain apa pun yang telah disebutkan orang lain di atas. Dengan cara ini Anda mendapatkan lokal default untuk jvm. Anda selalu bisa meneruskan di lokal (dan mungkin default ke lokal sistem jika nol) juga agar lebih kuat.

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

Anda perlu menyertakan keseluruhan str.startsWith(otherStr)untuk setiap item, karena ||hanya berfungsi dengan ekspresi boolean (benar atau salah).

Ada opsi lain jika Anda memiliki banyak hal untuk diperiksa, seperti ekspresi reguler , tetapi ekspresi tersebut cenderung lebih lambat dan ekspresi reguler yang lebih rumit umumnya lebih sulit dibaca.

Contoh ekspresi reguler untuk mendeteksi singkatan nama hari adalah:

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

Ketika Anda mengatakan Anda mencoba menggunakan ATAU, bagaimana tepatnya Anda mencoba dan menggunakannya? Dalam kasus Anda, apa yang perlu Anda lakukan adalah seperti ini:

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