Làm cách nào để kiểm tra xem một chuỗi có bắt đầu bằng một trong một số tiền tố hay không?


101

Tôi có câu lệnh if sau:

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

Tôi muốn nó bao gồm startsWith Mon Tues Weds Thurs Fridayvv Có cách nào đơn giản để làm điều này khi sử dụng chuỗi không? Tôi đã thử ||nhưng nó không hoạt động.


4
Bạn có nghĩa là bạn đã thử "Mon||Tues"vv? Hay bạn đã sử dụng newStr4.startsWith("Mon")||newStr4.startsWith("Tues") ...? Dù bằng cách nào, hãy xác định "nó không hoạt động".
Thomas

Bạn có đang cố gắng phân tích cú pháp một ngày nào đó không ?? Nếu vậy, hãy sử dụng SimpleDateFormat ...
Adam

Câu trả lời:


176

Bạn có hiểu cái này không:

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

Hoặc bạn có thể sử dụng biểu thức chính quy:

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

2
Có sự khác biệt nào về hiệu suất trong hai phương pháp bạn đề xuất không?
TheCrazyProgrammer

6
@TheCrazyProgrammer Tất nhiên là có; so khớp thông qua biểu thức chính quy đắt hơn nhiều so với các cuộc gọi phương thức chuỗi thô. Số liệu chính xác tôi không thể đưa ra, nhưng đây là sự đồng thuận chung.
klaar

52

Bên cạnh các giải pháp đã được trình bày, bạn có thể sử dụng thư viện Apache Commons Lang:

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

Cập nhật: sự ra đời của kỳ đà ở một số điểm làm cho cuộc gọi trở nên đơn giản hơn bây giờ:

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

31

Cho đến Streamnay không có ai đề cập đến, vì vậy đây là:

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

6
tuyệt vời (và up-to-date) câu trả lời ... btw s -> newStr4.startsWith(s)có thể được thay thế bằng newStr7::startsWithđể được rõ ràng hơn
Jordi Castilla

Làm thế nào tôi có thể bỏ quaCase ở đây?
happybuddha

Bạn có thể sử dụng hàm String toLowerCase ().
Ilia Kopysov

7

Một giải pháp đơn giản là:

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

Một giải pháp tuyệt vời hơn sẽ là:

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

3
Hoặc Arrays.binarySearch () nếu danh sách tìm kiếm của họ được sắp xếp: D
Brendan Long

2
@BrendanLong một chút của một overkill cho một danh sách ngắn như vậy, nhưng ok :)
Óscar López

3

Tất nhiên, hãy lưu ý rằng chương trình của bạn sẽ chỉ hữu ích ở các quốc gia nói tiếng Anh nếu bạn phát hiện ngày theo cách này. Bạn có thể muốn xem xét:

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

Từ đó bạn có thể sử dụng .startsWith hoặc .matches hoặc bất kỳ phương pháp nào khác mà những người khác đã đề cập ở trên. Bằng cách này, bạn nhận được ngôn ngữ mặc định cho jvm. Bạn luôn có thể chuyển bằng ngôn ngữ (và có thể mặc định nó thành ngôn ngữ hệ thống nếu nó là null) cũng như để mạnh mẽ hơn.


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

Bạn cần bao gồm toàn bộ str.startsWith(otherStr)cho mỗi mục, vì ||chỉ hoạt động với các biểu thức boolean (đúng hoặc sai).

Có các tùy chọn khác nếu bạn có nhiều thứ cần kiểm tra, chẳng hạn như biểu thức chính quy , nhưng chúng có xu hướng chậm hơn và biểu thức chính quy phức tạp hơn thường khó đọc hơn.

Một biểu thức chính quy mẫu để phát hiện chữ viết tắt của tên ngày sẽ là:

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

0

Khi bạn nói rằng bạn đã thử sử dụng HOẶC, chính xác thì bạn đã thử và sử dụng nó như thế nào? Trong trường hợp của bạn, những gì bạn cần làm sẽ như sau:

String newStr4 = strr.split("2012")[0];
if(newStr4.startsWith("Mon") || newStr4.startsWith("Tues")...)
str4.add(newStr4);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.