2012-03-20 33 views
77

Ive có sau câu lệnh if:Cách kiểm tra xem chuỗi có bắt đầu bằng một trong các tiền tố không?

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

Tôi muốn nó bao gồm startsWith 'Môn' 'Thứ Ba' 'Thrus' 'Friday' vv 'đôi vợ chồng bắt' Có một cách đơn giản để này khi sử dụng dây? Tôi đã thử '||' nhưng nó không hoạt động ...

Cảm ơn!

+4

Bạn có nghĩa là bạn đã cố gắng ' "Mon || Thứ Ba"' vv? Hoặc bạn đã sử dụng 'newStr4.startsWith (" Mon ") || newStr4.startsWith (" Tues ") ...'? Dù bằng cách nào, vui lòng xác định "nó không hoạt động". – Thomas

+0

Bạn đang cố gắng phân tích một ngày theo bất kỳ cơ hội nào ?? Nếu sử dụng SimpleDateFormat ... – Adam

Trả lời

132

Bạn có nghĩa là:

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ó bất kỳ sự khác biệt hiệu suất trong hai phương pháp bạn đề nghị? – TheCrazyProgrammer

+3

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

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 fancier 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()] (http://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html#binarySearch%28java.lang.Object [],% 20java.lang.Đối tượng% 29) nếu họ tìm kiếm danh sách được sắp xếp: D –

+1

@BrendanLong một chút của một overkill cho một danh sách ngắn như vậy, nhưng ok :) –

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

Bạn cần phải bao gồm toàn bộ str.startsWith(otherStr) cho từng hạng mục, vì || chỉ hoạt động với các biểu thức boolean (đúng hay 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ư regular expressions, nhưng chúng thường có xu hướng chậm hơn và phức tạp hơn thường khó đọc hơn.

Một ví dụ biểu hiện thường xuyên để phát hiện chữ viết tắt tên ngày sẽ là:

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

Khi bạn nói bạn cố gắng sử dụng HAY, làm thế nào Chính xác thì bạn cố gắng và sử dụng nó? Trong trường hợp của bạn, những gì bạn sẽ cần phải làm sẽ là một cái gì đó giống như vậy:

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

Bên cạnh những 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 
} 
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 ra ngày tháng 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à người khác đã đề cập ở trên. Bằng cách này bạn sẽ có được ngôn ngữ mặc định cho jvm. Bạn luôn luôn có thể vượt qua trong miền địa phương (và có thể mặc định nó vào miền địa phương hệ thống nếu nó là null) cũng được mạnh mẽ hơn.

14

Không ai đề cập Stream cho đến nay, vì vậy ở đây là:

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

câu trả lời tuyệt vời (và cập nhật) ... btw 's -> newStr4.startsWith (s)' có thể được thay thế bằng 'newStr7 :: startsWith' để rõ ràng hơn –

+0

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

Các vấn đề liên quan