จะตรวจสอบได้อย่างไรว่าสตริงเริ่มต้นด้วยคำนำหน้าหลายตัวหรือไม่?


101

ฉันมีคำสั่ง if ต่อไปนี้:

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

ฉันต้องการรวมstartsWith Mon Tues Weds Thurs Fridayฯลฯ มีวิธีง่ายๆในการใช้สตริงนี้หรือไม่? ฉันพยายาม||แล้วแต่มันไม่ได้ผล


4
คุณหมายถึงคุณพยายาม"Mon||Tues"ฯลฯ ? หรือคุณใช้newStr4.startsWith("Mon")||newStr4.startsWith("Tues") ...? ไม่ว่าจะด้วยวิธีใดโปรดกำหนด "มันใช้ไม่ได้"
โทมัส

คุณกำลังพยายามแยกวิเคราะห์วันที่โดยบังเอิญหรือไม่? ถ้าเป็นเช่นนั้นให้ใช้ SimpleDateFormat ...
อดัม

คำตอบ:


176

คุณหมายถึงสิ่งนี้:

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

หรือคุณสามารถใช้นิพจน์ทั่วไป:

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

2
มีความแตกต่างด้านประสิทธิภาพในสองวิธีที่คุณแนะนำหรือไม่?
TheCrazyProgrammer

6
@TheCrazyProgrammer แน่นอนมี; การจับคู่ผ่านนิพจน์ทั่วไปมีราคาแพงกว่าการเรียกวิธีสตริงดิบมาก ตัวเลขที่แน่นอนฉันไม่สามารถให้ได้ แต่นี่เป็นฉันทามติทั่วไป
klaar

52

นอกจากโซลูชันที่นำเสนอไปแล้วคุณสามารถใช้ไลบรารี Apache Commons Lang:

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

อัปเดต: การเปิดตัว varargs ในบางจุดทำให้การโทรง่ายขึ้นในขณะนี้:

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

31

ยังไม่มีใครพูดถึงStreamเลยดังนั้นนี่คือ:

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

6
คำตอบที่ดี (และเป็นปัจจุบัน) ... btw s -> newStr4.startsWith(s)สามารถแทนที่ได้newStr7::startsWithเพื่อให้ชัดเจนขึ้น
Jordi Castilla

ฉันจะเพิกเฉยต่อกรณีที่นี่ได้อย่างไร?
happybuddha

คุณสามารถใช้ฟังก์ชัน String toLowerCase ()
Ilia Kopysov

7

วิธีง่ายๆคือ:

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

ทางออกที่ดีกว่าคือ:

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

3
หรือArrays.binarySearch ()หากมีการจัดเรียงรายการค้นหา: D
Brendan Long

2
@Brendan ลองดูมากเกินไปสำหรับรายการสั้น ๆ แต่ก็โอเค :)
ÓscarLópez

3

แน่นอนว่าโปรแกรมของคุณจะมีประโยชน์ในประเทศที่พูดภาษาอังกฤษเท่านั้นหากคุณตรวจพบวันที่ด้วยวิธีนี้ คุณอาจต้องการพิจารณา:

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

จากตรงนั้นคุณสามารถใช้. เริ่มต้นด้วยหรือ. แมตช์หรือวิธีการอื่นใดที่คนอื่นกล่าวถึงข้างต้น ด้วยวิธีนี้คุณจะได้รับตำแหน่งเริ่มต้นสำหรับ jvm คุณสามารถส่งผ่านโลแคลได้ตลอดเวลา (และอาจเป็นค่าดีฟอลต์เป็นโลแคลของระบบหากเป็นโมแคล) เพื่อให้มีประสิทธิภาพมากขึ้น


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

คุณต้องรวมค่าทั้งหมดstr.startsWith(otherStr)สำหรับแต่ละรายการเนื่องจาก||ใช้ได้กับนิพจน์บูลีนเท่านั้น (จริงหรือเท็จ)

มีตัวเลือกอื่น ๆ หากคุณมีหลายสิ่งที่ต้องตรวจสอบเช่นนิพจน์ทั่วไปแต่มักจะช้ากว่าและโดยทั่วไปแล้วนิพจน์ทั่วไปที่ซับซ้อนจะอ่านยากกว่า

ตัวอย่างนิพจน์ทั่วไปสำหรับการตรวจจับตัวย่อของชื่อวันคือ:

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

0

เมื่อคุณบอกว่าคุณพยายามใช้ OR คุณลองใช้มันอย่างไร? ในกรณีของคุณสิ่งที่คุณต้องทำจะเป็นดังนี้:

String newStr4 = strr.split("2012")[0];
if(newStr4.startsWith("Mon") || newStr4.startsWith("Tues")...)
str4.add(newStr4);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.