2011-10-05 32 views
12

Tôi cần phải khớp các chuỗi trong mảng của tôi không bắt đầu bằng chuỗi "KB". Tôi đã thử điều nàyChuỗi kết hợp có cụm từ thông dụng trong trường hợp bỏ qua

String[] ar = {"KB_aaa","KB_BBB", "K_CCC", "!KBD", "kb_EEE", "FFFF"}; 
Pattern p = Pattern.compile("[^(^KB)].*"); 

for(String str : ar) 
{ 
    Matcher m = p.matcher(str); 
    if(m.matches()) 
     System.out.println(str); 
} 

Nhưng nó vẫn không khớp với "K_CCC". Cảm ơn

+1

Chủ đề liên quan: http://stackoverflow.com/questions/7659449/jdbc-get-table-list-calling-method-gettables-of-databasemetadata-with-advanced-t – adatapost

Trả lời

7

Một regex phù hợp với bất cứ điều gì không bắt đầu với KB là:

^(?!KB).* 

Để làm điều đó trong java:

if (str.matches("^(?!KB).*$")) ... 
33

Tôi sẽ không sử dụng RegEx cho mọi thứ.

for(String str : ar) 
{ 
    if(!str.toUpperCase().startsWith("KB")) 
     System.out.println(str); 
} 
+4

Câu trả lời hay nhất tôi đã đọc hôm nay. –

+0

Ah, bạn đánh tôi với nó. +1 –

+0

Bởi vì nó có thể không chỉ KB và có thể được biểu hiện phức tạp, bây giờ tôi cần điều này :) –

5

Bạn không nên sử dụng regexes ở khắp mọi nơi. Chỉ cần tạo một kiểm tra đơn giản:

for (String str : ar) 
{ 
    if (!str.toLowerCase().startsWith("kb")) 
     System.out.println(str); 
} 

Và tôi nghĩ, rằng phương pháp này thậm chí còn tốt hơn trong performace (không hoạt động đó là cần thiết trong trường hợp của bạn):

public static boolean accept(String name) 
{ 
    if (name.length() < 2) return true; 
    String sub = name.substring(0, 2); 
    return !sub.equalsIgnoreCase("KB"); 
} 

gì làm người khác điều của thứ hai này cách làm việc?

+0

Tôi không cần nó với regex :) Đây chỉ là một ví dụ đơn giản để không phù hợp với các chuỗi bắt đầu với KB –

10
String[] ar = {"KB_aaa","KB_BBB", "K_CCC", "!KBD", "kb_EEE", "FFFF"}; 
    Pattern p = Pattern.compile("^KB.*", Pattern.CASE_INSENSITIVE); 

    for(String str : ar) 
    { 
     Matcher m = p.matcher(str); 
     if(!m.matches()) 
      System.out.println(str); 
    } 
21

Từ cách câu hỏi của bạn được diễn đạt, tôi không hoàn toàn chắc chắn liệu bạn có muốn đối sánh không phân biệt chữ hoa chữ thường hay không. Regex này:

(?i)[^k][^b].* 

sử dụng cờ (? I) để tắt độ nhạy của chữ hoa và muốn bạn muốn.

+2

một cách trung thực tôi nghĩ rằng đây là câu trả lời đúng - tôi nghĩ câu hỏi rộng hơn theo ý nghĩa làm thế nào để bạn nói RE động cơ để bỏ qua trường hợp – user1172468

+0

Đây không phải là câu trả lời đúng. Mẫu của bạn sẽ KHÔNG khớp với một chuỗi như aw234 hoặc vj2345 – VHS

3

Sử dụng regex (?i)^(?!kb).* cho các trường hợp không khớp. Nó sẽ tránh KB234 Kb * 432, kB2343 và kb23445.

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