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.


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

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

31

StreamSejauh ini belum ada yang disebutkan , jadi ini dia:

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

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

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.


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

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);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.