Bir dizenin birkaç önekten biriyle başlayıp başlamadığı nasıl kontrol edilir?


101

Aşağıdaki if ifadesine sahibim:

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

Dahil etmesini istiyorum startsWith Mon Tues Weds Thurs Fridayvb. Dizeleri kullanırken bunun basit bir yolu var mı? Denedim ||ama işe yaramadı.


4
Yani denedin "Mon||Tues"mi? Yoksa kullandın newStr4.startsWith("Mon")||newStr4.startsWith("Tues") ...mı? Her iki durumda da lütfen "işe yaramadı" olarak tanımlayın.
Thomas

Herhangi bir şans eseri bir tarihi ayrıştırmaya mı çalışıyorsunuz? Öyleyse SimpleDateFormat'ı kullanın ...
Adam

Yanıtlar:


176

Bunu mu diyorsun:

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

Veya normal ifadeyi kullanabilirsiniz:

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

2
Önerdiğiniz iki yöntemde herhangi bir performans farkı var mı?
TheCrazyProgrammer

6
@TheCrazyProgrammer Elbette var; düzenli ifadelerle eşleştirme, ham dize yöntemi çağrılarından çok daha pahalıdır. Kesin rakamlar veremem ama genel fikir birliği bu.
klaar

52

Halihazırda sunulan çözümlerin yanı sıra Apache Commons Lang kitaplığını da kullanabilirsiniz:

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

Güncelleme: Bir noktada varargların tanıtılması, aramayı şimdi daha basit hale getiriyor:

StringUtils.startsWithAny(newStr4, "Mon", "Tues",...)

31

StreamŞimdiye kadar kimseden söz edilmedi, işte burada:

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

6
harika (ve güncel) cevap ... btw daha net s -> newStr4.startsWith(s)olmak için değiştirilebilirnewStr7::startsWith
Jordi Castilla

Burada Case'i nasıl görmezden gelebilirim?
happybuddha

String toLowerCase () işlevini kullanabilirsiniz.
Ilia Kopysov

7

Basit bir çözüm:

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

Daha meraklı bir çözüm şöyle olabilir:

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

3
Veya Arrays.binarySearch () arama listesi sıralanırsa: D
Brendan Long

2
@BrendanLong, bu kadar kısa bir liste için biraz abartılı, ama tamam :)
Óscar López

3

Elbette, tarihleri ​​bu şekilde belirlerseniz programınızın yalnızca İngilizce konuşulan ülkelerde faydalı olacağını unutmayın. Şunları düşünmek isteyebilirsiniz:

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

Oradan .startsWith veya .matches veya başkalarının yukarıda bahsettiği başka bir yöntemi kullanabilirsiniz. Bu şekilde jvm için varsayılan yerel ayarı elde edersiniz. Daha güçlü olmak için her zaman yerel ayarı (ve boş ise varsayılan olarak sistem yerel ayarına) geçirebilirsiniz.


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

Yalnızca boole ifadeleriyle (doğru veya yanlış) çalıştığından str.startsWith(otherStr), her öğe için bütünü eklemeniz gerekir ||.

Normal ifadeler gibi kontrol etmeniz gereken çok şey varsa başka seçenekler de vardır , ancak bunlar daha yavaş olma eğilimindedir ve daha karmaşık normal ifadelerin okunması genellikle daha zordur.

Gün adı kısaltmalarını tespit etmek için örnek bir normal ifade şöyle olabilir:

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

0

Ameliyathaneyi kullanmayı denediğinizi söylediğinizde, tam olarak nasıl denediniz ve kullandınız? Sizin durumunuzda yapmanız gereken şey şuna benzer:

String newStr4 = strr.split("2012")[0];
if(newStr4.startsWith("Mon") || newStr4.startsWith("Tues")...)
str4.add(newStr4);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.